zoukankan      html  css  js  c++  java
  • gorm系列-创建记录及字段默认值

    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:gostudentginlesson21>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`
    }
    


  • 相关阅读:
    HDU 1232 畅通工程(并查集分析)
    NYOJ 2 括号配对问题
    HDU 1205 吃糖果
    HDU 1201 18岁生日
    [ACM] hdu Find a way
    [ACM] hdu Ignatius and the Princess I

    pongo(英雄会)编程挑战: 人人code,整数取反
    [ACM] POJ 1852 Ants
    波司登杯2013微软office应用创意大赛烟台大学校园赛参赛历程
  • 原文地址:https://www.cnblogs.com/zisefeizhu/p/12788043.html
Copyright © 2011-2022 走看看