一、数据库结构
CREATE TABLE `models` (`a` text, `aaaa` text);
CREATE TABLE au(
a TEXT,
b INT
);
二、插入0值
package main
import (
"fmt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type au struct {
A string
B int
}
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Create(&au{A: "au结构体方式创建", B: 0}).Error; err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Create(map[string]interface{}{"a": "map方式创建", "b": 0}).Error; err != nil {
fmt.Print(err)
return
}
}
都可以插入成功,执行结果:
CREATE TABLE `models` (`a` text, `aaaa` text);
CREATE TABLE au(
a TEXT,
b INT
);
INSERT INTO au VALUES('au结构体方式创建',0);
INSERT INTO au VALUES('map方式创建',0);
COMMIT;
三、更新为0值
package main
import (
"fmt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type au struct {
A string
B int
}
func main() {
a := []au{}
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
fmt.Print(err)
return
}
if err := db.Table("au").Create(&au{A: "au结构体方式更新", B: 1}).Error; err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Create(&au{A: "map方式更新", B: 1}).Error; err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Create(&au{A: "直接更新", B: 1}).Error; err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Find(&a).Error; err != nil {
fmt.Print(err)
return
}
fmt.Println(a)
if err = db.Table("au").Where("a", "au结构体方式更新").Updates(&au{B: 0}).Error; err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Where("a", "map方式更新").Updates(map[string]interface{}{"b": 0}).Error; err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Where("a", "直接更新").Update("b", 0).Error; err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Find(&a).Error; err != nil {
fmt.Print(err)
return
}
fmt.Println(a)
}
执行结果:
[{au结构体方式更新 1} {map方式更新 1} {直接更新 1}]
[{au结构体方式更新 1} {map方式更新 0} {直接更新 0}]
使用结构体更新的方式失败,建议使用map,或直接更新。
四、用0值作为条件查询
数据库的数据:
CREATE TABLE `models` (`a` text, `aaaa` text);
CREATE TABLE au(
a TEXT,
b INT
);
INSERT INTO au VALUES('au结构体方式更新',1);
INSERT INTO au VALUES('map方式更新',0);
INSERT INTO au VALUES('直接更新',0);
查询b=0的数据,执行代码:
package main
import (
"fmt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type au struct {
A string
B int
}
func main() {
a := []au{}
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
fmt.Print(err)
return
}
if err = db.Table("au").Where(&au{B: 0}).Find(&a).Error; err != nil {
fmt.Print(err)
return
}
fmt.Println("结构体方式查询:")
fmt.Println(a)
if err = db.Table("au").Where(map[string]interface{}{"b": 0}).Find(&a).Error; err != nil {
fmt.Print(err)
return
}
fmt.Println("map方式查询:")
fmt.Println(a)
if err = db.Table("au").Where("b", 0).Find(&a).Error; err != nil {
fmt.Println(err)
return
}
fmt.Println("直接查询:")
fmt.Println(a)
}
结构体方式会将数据库里所有的数据都查询到,并没有调用b=0的条件
执行结果:
结构体方式查询:
[{au结构体方式更新 1} {map方式更新 0} {直接更新 0}]
map方式查询:
[{map方式更新 0} {直接更新 0}]
直接查询:
[{map方式更新 0} {直接更新 0}]
五、结论
在查询更新0值时,最好使用map或直接写入条件的方式。