gorm 这样写不会有点乱么
//learn from https://juejin.cn/post/6844904090196000775
package main
import (
"time"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type User struct {
Id uint `gorm:"AUTO_INCREMENT"`
Name string `gorm:"size:50"`
Age int `gorm:"default:18"`
Birthday *time.Time
Email string `gorm:"type:varchar(50);unique_index"`
Password string `gorm:"type:varchar(25)"`
}
var db *gorm.DB //GORM 提供了 DB 方法,可用于从当前 *gorm.DB 返回一个通用的数据库接口 *sql.DB
/*
func main() {
//DBResolver的用法
db, err := gorm.Open("mysql", "root:123456@(localhost)/dbtest1?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
fmt.Errorf("创建数据库连接失败:%v", err)
}
defer db.Close()
//自动迁移数据结构table scheme,会创建表,确实表的外键,约束,列和索引。
db.AutoMigrate(&User{}, &Product{}, &Order{})
//为User创建表 db.Migrator().CreateTables(&User{})
// 出于保护数据的目的,它不会删除未使用的列;且其会自动创建数据库外键约束
// 返回当前使用的数据库名 db.Migrator().CurrentDatabase()
db.AutoMigrate(&User{}) //如果出现了这句有问题,可能是因为_ "github.com/jinzhu/gorm/dialects/mysql"其依赖没有导入
//在gorm中,默认的表名都是结构体名称的复数形式,比如User结构体默认创建的表为Users
//db.SingularTable(true)可以取消表名的复数形式,使得表名和结构体名称一致
//添加唯一索引
db.Model(&User{}).AddUniqueIndex("name_email", "id", "name", "email")
//插入记录
db.Create(&User{Name: "张三", Age: 18, Email: "zhangshan@163.com"})
db.Create(&User{Name: "李四", Age: 20, Email: "lisi@qq.com"})
var user User //是用来接收(映射)查到的值的吗
var users []User //同上
//查看插入后的全部元素
fmt.Printf("插入后元素:\n")
db.Find(&users)
fmt.Println(users) //打印全部元素
db.First(&user, "name = ?", "小明")
//查询一条记录
db.First(&user, "name = ?", "张三")
fmt.Println("查询记录:", user) //查到的只有张三的记录
//更新记录(基于查出来的数据进行更新)
db.Model(&user).Update("name", "Mike") // 查出来的值仍然存在之前的结构体变量中,所以对之前的结构体进行操作就可以了
fmt.Println("更改后的记录为:", user)
//删除记录
db.Delete(&user)
//查看全部记录
fmt.Println("查看全部记录:")
db.Find(&users)
fmt.Println(users)
var user1 User //每次要执行查询之类的都要重新定义接收者,不然还是之前那个接收者的值
db.First(&user1)
fmt.Println(user1)
// 为啥我这个批量添加不可以呢?
// var usersInsert = []User{{Name:"jinzhu1",Age: 12},{Name: "jinzhu2",Age: 12}}
// db.Create(&usersInsert)
// 获取条件全部匹配的记录
db.Create(&User{Name: "李四"})
db.Create(&User{Name: "李四"})
var users1 []User
db.Where("name = ?", "李四").Find(&users1)
fmt.Println(users1)
}
*/
with raw sql
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type Result struct {
ID int
Name string
Age int
}
func main() {
// 使用原生sql来查询
var result Result
db, _ := gorm.Open("mysql", "root:123456@(localhost)/dbtest1?charset=utf8mb4&parseTime=True&loc=Local")
db.Raw("SELECT id,name,age FROM users Where id = ?", 3).Scan(&result)
fmt.Println(result)
//执行原生sql
// db.Exec("DROP TABLE users")
}