gorm快速入门
gorm快速入门
1.快速入门
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
// Migrate the schema
db.AutoMigrate(&Product{})
// 创建
db.Create(&Product{Code: "L1212", Price: 1000})
// 读取
var product Product
db.First(&product, 1) // 查询id为1的product
db.First(&product, "code = ?", "L1212") // 查询code为l1212的product
// 更新 - 更新product的price为2000
db.Model(&product).Update("Price", 2000)
// 删除 - 删除product
db.Delete(&product)
}
2. 连接mysql
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
}
// 方法二
for {
db, err = gorm.Open("postgres", "host="+host+" port="+port+" user="+dbUser+" dbname="+dbName+" password="+password+" sslmode="+sslMode)
if err == nil {
break
}
log.Error(err)
time.Sleep(time.Duration(2) * time.Second)
}
db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(20)
// db = db.Debug()
3.表名默认就是结构体名称的复数,更改默认的表名
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string {
return "prefix_" + defaultTableName;
}
4.指定表名,进行增删改查
// 使用User结构体创建名为`deleted_users`的表
db.Table("deleted_users").CreateTable(&User{})
// 创建表时会追加 “ENGINE=InnoDB” 到 SQL 语句中。
db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})
// SELECT * FROM deleted_users;
var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
// DELETE FROM deleted_users WHERE name = 'jinzhu';
db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
5.增删该查
//增加一条记录
var animal = Animal{Age: 99, Name: ""}
db.Create(&animal)
//创建之前,修改字段的值
func (user *User) BeforeCreate(scope *gorm.Scope) error {
scope.SetColumn("ID", uuid.New())
return nil
}
6.预加载
db.Set("gorm:auto_preload", true).Find(&users)
db.Preload("Orders.OrderItems").Find(&users)
//自定义预加载
db.Preload("Orders", func(db *gorm.DB) *gorm.DB {
return db.Order("orders.amount DESC")
}).Find(&users)
7.手动事务开启
// 开启事务
tx := db.Begin()
// 在事务中做一些数据库操作 (这里应该使用 'tx' ,而不是 'db')
tx.Create(...)
// ...
// 有错误时,手动调用事务的 Rollback()
tx.Rollback()
// 无错误时,手动调用事务的 Commit()
tx.Commit()
8.执行原生sql
// 原生 SQL
rows, err := db.Raw("select name, age, email from users where name = ?", "jinzhu").Rows() // (*sql.Rows, error)
defer rows.Close()
for rows.Next() {
...
rows.Scan(&name, &age, &email)
...
}
//原生sql
var result Result
db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)
db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)", time.Now(), []int64{11,22,33})
9.开启db日志
// 启用Logger,显示详细日志
db.LogMode(true)
// 禁用日志记录器,不显示任何日志
db.LogMode(false)
// 调试单个操作,显示此操作的详细日志
db.Debug().Where("name = ?", "jinzhu").First(&User{})
// 使用 os.Stdout 作为输出
db.SetLogger(log.New(os.Stdout, "\r\n", 0))
相关链接
https://jasperxu.github.io/gorm-zh/
https://www.cnblogs.com/shijingjing07/p/10315411.html
【励志篇】:
古之成大事掌大学问者,不惟有超世之才,亦必有坚韧不拔之志。