go语言数据库操作, gorm框架

type User struct{

ID uint `gorm:"primary_key"`

Name string

Age int

Birthday time.Time

AddTime time.Time

}

连接数据库

db, err := gorm.Open("mysql", "用户名:密码@tcp(地址:端口号)/数据库名")

if err != nil {

panic("连接数据库失败")

}

创建表

db.SingularTable(true) //不设置,创建生成的表名都是默认是复数形式后面带s的,设置上这一句话,就不会默认带s了

//db.CreateTable(&User{}) //创建表

表内插入数据

//user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

//db.Create(&user) //插入数据

查询

查询出所有的数据,查询到的结果是个可循环的切片

type User struct{

ID uint `gorm:"primary_key"`

Name string

Age int

Birthday time.Time

}

var user []User

a :=db.Find(&user) #查询出所有的

打印出来查询的东西

for _, a:= range user {

fmt.Println(a)

fmt.Println(a.ID)

}

查询出所有符合条件的数据,查询到的结果是个可循环的切片

var user []User

//select * from user where name="Jinzhu1"

a :=db.Where("name = ?", "Jinzhu1").Find(&user) //Find是查询所有,First查询出一条

for _, a:= range user {

fmt.Println(a)

fmt.Println(a.ID)

}

db.Where("name = ?", "jinzhu").First(&users) //查询出一条符合的数据

db.Where("name <> ?", "jinzhu").Find(&user) //查出name不等于jinzhu的数据

db.Where("name in (?)", []string{"jinzhu", "jinzhu1"}).Find(&user) //查询出name in ("jinzhu", "jinzhu1") 所有数据

db.Where("name LIKE ?", "%jin%").Find(&user) //模糊查询 select * from user where name LIKE "%jin%"

db.Where("name = ? AND age >= ?", "jinzhu", "17").Find(&user) //select * FROM user Where name ="jinzhu" AND age>17

db.Where(&User{Name: "jinzhu", Age: 20}).First(&user) //SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;

db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users) //SELECT * FROM users WHERE name = "jinzhu" AND age = 20;

db.Where([]int64{1, 2, 3}).Find(&user) //SELECT * FROM users WHERE id IN (20, 21, 22);

用结构体查询的时候,GORM只会与非零条件查询,查询条件中的 0 ,"",false获取他零值,它不会被用来构成查询条件,例如

db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users) // SELECT * FROM users WHERE name = "jinzhu";

查询出来的数据是单条的话

user :=User{}

db.Find(&user) // 查询

fmt.Println(user.ID) //获取使用查询出来的某个字段

更新

单条更新的(包括自动更新的如当前时间的字段)

user :=User{}

db.First(&user) //查询出一条数据

user.Name="334" //给数据赋新值

db.Save(&user) //更新 UPDATE users SET name='334' WHERE id=1;但是如果表中有自动更新的字段,如时间更新当前的时间,那么用Save也会把这些一块更新的

单条更新更新改变字段

user := User{}

db.Model(&user).Update("name","啊") //更新所有的数据 name="啊"

更新符合条件的数据

db.Model(&user).Where("id = ?", 1).Update("name", "hello")

更新所有数据的多个字段

db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18})

更新所有数据的多个字段

db.Model(&user).Updates(User{Name: "hello", Age: 18})

下面这个不会被更新,只会更新非空白的值,即非 0,false ,""等

db.Model(&user).Updates(User{Name: "", Age: 0})

更新字段忽略选定的字段,下面忽略了name omit中的

db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "321", "age": 118})

更新选定的字段,只更新name字段即Select里面的字段

db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18})

批量更新符合条件的数据

db.Table("user").Where("id IN (?)", []int{1, 2}).Updates(map[string]interface{}{"name": "aa", "age": 9})

db.Model(User{}).Where("id IN (?)",[]int{1,2}).Updates(User{Name: "cc", Age: 13})

删除

user := User{}

db.Delete(&user) //删除表里的所有数据了

带条件的删除

db.Where("name LIKE ?", "%jinzhu%").Delete(User{})