type User struct{
ID uint `gorm:"primary_key"`
Name string
Age int
Birthday time.Time
AddTime time.Time
}mysql
鏈接數據庫
db, err := gorm.Open("mysql", "用戶名:密碼@tcp(地址:端口號)/數據庫名")
if err != nil {
panic("鏈接數據庫失敗")
}
建立表sql
db.SingularTable(true) //不設置,建立生成的表名都是默認是複數形式後面帶s的,設置上這一句話,就不會默認帶s了
//db.CreateTable(&User{}) //建立表
表內插入數據
//user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
//db.Create(&user) //插入數據
數據庫
查詢tcp
查詢出全部的數據,查詢到的結果是個可循環的切片
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{})ui