package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// 定义模型 模型主要起的是承载--映射的作用
type User struct {
gorm.Model
Name string
Age int
}
/*
new用于任何类型的内存分配,返回指向该类型的零值对象的指针。
make用于引用类型(切片、映射和通道)的初始化,返回一个非零值的已初始化对象。
*/
func main() {
//连接数据库
db, err := gorm.Open("mysql", "root:20030303@(localhost:3306)/db1?charset=utf8mb4&parseTime=true&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
//模型与数据库中的表对应起来
db.AutoMigrate(&User{}) //自动转移
//创建
//us := User{Name: "moxu", Age: 20}
//db.Create(&us)
//查询
//var ans User //声明模型结构体类型
ans := new(User) //new make 区别 make是给固定的几个,比如map,chan,slice
db.First(ans)
fmt.Printf("%#v\n\n", ans)
//ans2 = make([]User, 0, 10)
var ans2 []User
db.First(&ans2)
fmt.Printf("%#v\n\n", ans2)
db.Where([]int64{1}, ans) //查询主键为1 gorm 的查询类似于sql 可以进行约束查询 也可以结构体查询 map查询
fmt.Printf("%#v\n\n", ans)
//查询 内联条件--方便
db.Find(ans, "name=?", "moxu")
fmt.Printf("%#v\n", ans)
db.FirstOrInit(ans, User{Name: "小王子", Age: 100}) //找不到就初始化这个变量
fmt.Printf("%#v\n", ans)
db.Attrs(User{Age: 92929}).FirstOrInit(ans, User{Name: "的骄傲多久啊我"}) //执行查询之前,将Age字段设置为92929,并在数据库中查找姓名为"的骄傲多
// 久啊我"的用户记录。如果找到了匹配的记录,将会将查询结果赋值给ans;如果没有找到匹配的记录,则会创建一个新的User实例,并将其赋值给ans
fmt.Printf("%#v\n", ans)
/*
Attrs 如果记录未找到,将使用参数初始化struct
Assign 不管记录是否找到,都将参数赋值给struct
*/
/*
FirstAndCreate会在数据库中创建并保存新的记录,而FirstAndInit只会创建一个新的实例但不保存到数据库。
FirstAndCreate返回的是查询结果或新创建的记录,而FirstAndInit返回的是查询结果或新创建的实例。
FirstAndCreate会对数据库进行写操作,可能会引起数据变动,而FirstAndInit只会对内存中的实例进行操作,不会对数据库进行写操作。
*/
/*
select 指定想从数据库查询的字段 默认全部字段
*/
}
我只想说 比sql繁琐 但是通用性强 换别的数据库的时候只需要进行数据库的连接的修改