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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM