gorm系列-创建记录及字段默认值
程序员文章站
2022-03-26 19:45:07
[TOC] Gorm创建记录及字段默认值 CRUD通常指数据库的增删改查操作 创建 go package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //1. 定义模 ......
gorm创建记录及字段默认值
crud通常指数据库的增删改查操作
创建
package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //1. 定义模型 type user struct { id int64 name string age byte } func main() { //2. 连接mysql数据库 db, err := gorm.open("mysql","root:123456@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parsetime=true&loc=local") if err != nil { panic(err) } defer db.close() //3. 把模型与数据库中的表对应起来 db.automigrate(&user{}) //4. 创建结构体实例 u := user{name:"zisefeizhu", age:22} //在代码层面创建一个user对象 fmt.println(db.newrecord(&u)) // 主键为空返回`true` db.create(&u) // 在数据库中创建一条user记录 fmt.println(db.newrecord(u)) // 创建`user`后返回`false` } //e:\gostudent\gin\lesson21>go run main.go //true //false
默认值
可以通过 tag 定义字段的默认值
func main() { //2. 连接mysql数据库 db, err := gorm.open("mysql","root:123456@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parsetime=true&loc=local") if err != nil { panic(err) } defer db.close() //3. 把模型与数据库中的表对应起来 db.automigrate(&user{}) //4. 创建结构体实例 //u := user{name: "zisefeizhu",age:30} //在代码层面创建一个user对象 //u := user{age:30} //在代码层面创建一个user对象 u := user{age:30} //在代码层面创建一个user对象 fmt.println(db.newrecord(&u)) // 主键为空返回`true` db.create(&u) // 在数据库中创建一条user记录 fmt.println(db.newrecord(u)) // 创建`user`后返回`false` }
删除表在执行
上面代码实际执行的sql语句是insert into users("age") values('30');,排除了零值字段name,而在数据库中这一条数据会使用设置的默认值zisefeizhu作为name字段的值。
注意:所有字段的零值, 比如0, "",false或者其它零值,都不会保存到数据库内,但会使用他们的默认值。 如果你想避免这种情况,可以考虑使用指针或实现 scanner/valuer接口,比如
u := user{name: "",age:50} //在代码层面创建一个user对象 fmt.println(db.newrecord(&u)) // 主键为空返回`true` db.debug().create(&u) // 在数据库中创建一条user记录
使用指针方式实现零值存入数据库
import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //1. 定义模型 type user struct { id int64 name *string `gorm:"default:'zisefeizhu'"` //注意指针 age byte } func main() { //2. 连接mysql数据库 db, err := gorm.open("mysql","root:123456@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parsetime=true&loc=local") if err != nil { panic(err) } defer db.close() //3. 把模型与数据库中的表对应起来 db.automigrate(&user{}) //4. 创建结构体实例 u := user{name: new(string),age:50} //在代码层面创建一个user对象 fmt.println(db.newrecord(&u)) // 主键为空返回`true` db.debug().create(&u) // 在数据库中创建一条user记录 fmt.println(db.newrecord(u)) // 创建`user`后返回`false` }
使用scanner/valuer接口方式实现零值存入数据库
import ( "database/sql" "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //1. 定义模型 type user struct { id int64 //name *string `gorm:"default:'zisefeizhu'"` name sql.nullstring `gorm:"default:'zisefeizhu'"` age byte } func main() { //2. 连接mysql数据库 db, err := gorm.open("mysql","root:123456@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parsetime=true&loc=local") if err != nil { panic(err) } defer db.close() //3. 把模型与数据库中的表对应起来 db.automigrate(&user{}) //4. 创建结构体实例 //u := user{name: new(string),age:50} //在代码层面创建一个user对象 //u := user{name: sql.nullstring{"", true}, age: 60} u := user{name: sql.nullstring{"", false}, age: 60} fmt.println(db.newrecord(&u)) // 主键为空返回`true` db.debug().create(&u) // 在数据库中创建一条user记录 fmt.println(db.newrecord(u)) // 创建`user`后返回`false` }
上一篇: Vue.js 事件处理器+表单
下一篇: 6. Go 语言数据类型:字典与布尔类型