tag
说明
样例
column
自定义字段名
自定义 gorm:"column:f_id;"
type
字段类型
gorm:"type:varchar(20);" gorm:"type:integer(8);"
type Like struct { ID int `gorm:"column:f_id;primary_key"` Ip string `gorm:"type:varchar(20);not null;index:ip_idx"` Ua string `gorm:"type:varchar(256);not null;"` Title string `gorm:"type:varchar(128);not null;index:title_idx"` Hash uint64 `gorm:"unique_index:hash_idx;"` CreatedAt time.Time }
连接 mysql import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) var db *gorm.DBfunc init () { var err error db, err = gorm.Open("mysql" , "<user>:<password>/<database>?charset=utf8&parseTime=True&loc=Local" ) if err != nil { panic (err) } }
sqlite import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sqlite" ) var db *gorm.DBfunc main () { var err error db, err = gorm.Open("sqlite3" , "/tmp/gorm.db" ) defer db.Close() }
PostgreSQL import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/postgres" ) var db *gorm.DBfunc main () { var err error db, err := gorm.Open("postgres" , "host=myhost user=gorm dbname=gorm sslmode=disable password=mypassword" ) defer db.Close() }
错误处理 执行任何操作后,如果发生任何错误,GORM将其设置为*DB的Error字段
if err := db.Where("name = ?" , "jinzhu" ).First(&user).Error; err != nil { } db.First(&user).Limit(10 ).Find(&users).GetErrors() db.Where("name = ?" , "hello world" ).First(&user).RecordNotFound() if db.Model(&user).Related(&credit_card).RecordNotFound() { }
连接池 db.DB().SetMaxIdleConns(10 ) db.DB().SetMaxOpenConns(100 )
事务 tx := db.Begin() tx.Create(...) tx.Rollback() tx.Commit()
样例 func CreateAnimals (db *gorm.DB) err { tx := db.Begin() if err := tx.Create(&Animal{Name: "Giraffe" }).Error; err != nil { tx.Rollback() return err } if err := tx.Create(&Animal{Name: "Lion" }).Error; err != nil { tx.Rollback() return err } tx.Commit() return nil }
迁移 自动迁移仅仅会创建表,缺少列和索引,并且不会改变现有列的类型或删除未使用的列以保护数据。
db.AutoMigrate(&User{}) db.AutoMigrate(&User{}, &Product{}, &Order{}) db.Set("gorm:table_options" , "ENGINE=InnoDB" ).AutoMigrate(&User{})
创建表 默认创建表回添加 s 在末尾,可以使用下面语句关闭
db.CreateTable(&User{}) db.Set("gorm:table_options" , "ENGINE=InnoDB" ).CreateTable(&User{})
索引 db.Model(&User{}).AddIndex("idx_user_name" , "name" ) db.Model(&User{}).AddIndex("idx_user_name_age" , "name" , "age" ) db.Model(&User{}).AddUniqueIndex("idx_user_name" , "name" ) db.Model(&User{}).AddUniqueIndex("idx_user_name_age" , "name" , "age" ) db.Model(&User{}).RemoveIndex("idx_user_name" )
表是否存在 db.HasTable(&User{}) db.HasTable("users" )
删除表 db.DropTable(&User{}) db.DropTable("users" ) db.DropTableIfExists(&User{}, "products" )
设置默认表名 你可以通过定义DefaultTableNameHandler来设置默认表名的命名规则
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string ) string { return "prefix_" + defaultTableName; }
设置列名 下划线分割命名(Snake Case)的列名
type User struct { ID uint Name string Birthday time.Time CreatedAt time.Time } type Animal struct { AnimalId int64 `gorm:"column:beast_id"` Birthday time.Time `gorm:"column:day_of_the_beast"` Age int64 `gorm:"column:age_of_the_beast"` }
Run Raw SQL db.Exec("DROP TABLE users;" ) db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)" , time.Now(), []int64 {11 ,22 ,33 }) type Result struct { Name string Age int } var result Resultdb.Raw("SELECT name, age FROM users WHERE name = ?" , 3 ).Scan(&result) db.Raw("select count(1) as total from user" ).Scan(&count)
修改列 db.Model(&User{}).ModifyColumn("description" , "text" )
删除列 db.Model(&User{}).DropColumn("description" )