一、連接數據庫:
dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil{ return }
賬號:密碼@tcp(127.0.0.1:3306)/庫名
二、遷移表
package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" "time" ) type User struct { ID int 字段名:大寫開頭! Name string CreatedTime time.Time } func main() { dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil{ return } db.AutoMigrate(&User{}) }
關於表名:GORM 將 struct name 復數snake_cases
為表名,對於 struct User
,其表名是users
約定俗成的,
測試一下
type User struct { ID int Name string CreatedTime time.Time } type UserInfo struct { ID int Info string } func main() { dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil{ return } db.AutoMigrate(&User{}) db.AutoMigrate(&UserInfo{}) }
自定義表名:實現Tabler接口
例:
type User struct { ID int Name string CreatedTime time.Time } type UserInfo struct { ID int Info string } func (UserInfo) TableName() string { return "infos" } func main() { dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil{ return } db.AutoMigrate(&User{}) db.AutoMigrate(&UserInfo{}) }
還有一種方法自定義表名:
type User struct { ID int Name string CreatedTime time.Time } type UserInfo struct { ID int Info string } func (UserInfo) TableName() string { return "infos" } func main() { dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil{ return } //db.AutoMigrate(&User{}) //db.AutoMigrate(&UserInfo{}) db.Table("info_table").AutoMigrate(&UserInfo{}) }
關於字段名:大寫開頭!
type User struct {
ID uint // column name is `id`
Name string // column name is `name`
Birthday time.Time // column name is `birthday`
CreatedAt time.Time // column name is `created_at`
}
當然你也可以自定義
type Animal struct {
AnimalID int64 `gorm:"column:beast_id"` // set name to `beast_id`
Birthday time.Time `gorm:"column:day_of_the_beast"` // set name to `day_of_the_beast`
Age int64 `gorm:"column:age_of_the_beast"` // set name to `age_of_the_beast`
}
看起來無論表名還是字段名,GORM默認的規則都是比較合適的,命名比較規范的話,使用默認的即可。
設置默認值:
type User struct { gorm.Model Name string Age * int `gorm:"default:18"` Active sql.NullBool `gorm:"default:true"` }
三、關於字段的增刪改
1.增加字段
直接在結構體添加即可
AutoMigrate 將創建缺少外鍵、約束、列和索引的表。如果現有列的大小、精度、可為空值發生變化,它將更改現有列的類型。
type User struct {
ID int
Name string
Desc string
CreatedTime time.Time
}
func main() {
dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil{
return
}
db.AutoMigrate(&User{})
}
也可以
// 添加名稱字段 db.Migrator().AddColumn(&User{}, "Name" )
2.刪除字段
直接在結構體刪除字段是無效的。這是因為AutoMigrate 不會刪除未使用的列,保護您的數據。
type User struct { ID int Name string CreatedTime time.Time } func main() { dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil{ return } db.AutoMigrate(&User{}) }
db.Migrator().DropColumn(&User{}, "Desc" )
// 刪除字段
3.修改字段
db.Migrator ().RenameColumn(&User{}, "name", "NameNew" )
這里的名字好像沒有按原始的那樣。
db.Migrator ().RenameColumn(&User{}, "Name", "name_new" )