gorm
文档地址:
https://gorm.io/zh_CN/docs/
用法:
安装:
go get gorm.io/gorm
使用:
package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" ) type User struct { gorm.Model Name string `gorm:"column:name;type:varchar(20) NOT NULL;default:'';comment:姓名"` } func (User) TableName() string { return "user" } func main() { // 连接(单个数据库) dsn := "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local" db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{}) //// 连接(数据库集群) //dsn1 := "root:123456@tcp(10.0.0.12:3306)/test?charset=utf8mb4&parseTime=True&loc=Local" //dsn2 := "root:123456@tcp(10.0.0.13:3306)/test?charset=utf8mb4&parseTime=True&loc=Local" //db, _ := gorm.Open(mysql.Open(dsn1), &gorm.Config{}) //db.Use(dbresolver.Register(dbresolver.Config{ // Sources: []gorm.Dialector{mysql.Open(dsn1), mysql.Open(dsn2)}, // Replicas: []gorm.Dialector{mysql.Open(dsn1), mysql.Open(dsn2)}, // Policy: dbresolver.RandomPolicy{}, //})) // 创建表 db.AutoMigrate(&User{}) // 增 user := User{Name: "A"} db.Create(&user) // 删 db.Where("name = ?", "A").Delete(&User{}) // 改 db.Model(&User{}).Where("name = ?", "C").Updates(User{ Name: "D", }) // 查 var res User db.Where("name = ?", "D").First(&res) fmt.Println(res) // 事务 tx := db.Begin() r1 := db.Create(&User{Name: "E"}) r2 := db.Create(&User{Name: "F"}) if r1.RowsAffected > 0 && r2.RowsAffected > 0 { tx.Commit() } else { tx.Rollback() } }
gen
文档地址:
https://gorm.io/zh_CN/gen/
用法一,使用 gorm 生成数据表(先生成模型,后建表):
安装:
go get gorm.io/gen
使用:
目录结构:
|—— test/ // 根目录 ****|—— config/ ********|—— config.go // 配置文件 ****|—— model/ ********|—— model.go // 数据库模型文件 ****|—— generate.go // 生成gen代码文件 ****|—— main.go // 入口文件 ****|—— go.mod // go module文件
go.mod:
module test
config.go:
package config import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func NewDB() *gorm.DB { dsn := "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local" db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{}) return db }
model.go:
package model import ( "gorm.io/gen" "gorm.io/gorm" ) type Querier interface { // SELECT * FROM @@table WHERE name = @name FilterWithName(name string) ([]gen.T, error) } type User struct { gorm.Model Name string `gorm:"column:name"` } func (u User) TableName() string { return "user" }
generate.go:
package main import ( "gorm.io/gen" "test/config" "test/model" ) func main() { g := gen.NewGenerator(gen.Config{ OutPath: "./query", // 生成gen文件的目录 Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode }) db := config.NewDB() g.UseDB(db) g.ApplyBasic(model.User{}) g.ApplyInterface(func(model.Querier) {}, model.User{}) g.Execute() }
main.go:
package main import ( "fmt" "test/config" "test/model" "test/query" ) func main() { db := config.NewDB() //db.AutoMigrate(&model.User{}) // 迁移到数据库 userDao := query.Use(db).User // 增 err := userDao.Create(&model.User{ Name: "lee", }) fmt.Println("增:", err) // 删 resultDelete, err := userDao.Where(userDao.ID.Eq(1)).Delete() fmt.Println("删:", resultDelete, err) // 改 resultUpdate, err := userDao.Where(userDao.ID.Eq(2)).Update(userDao.Name, "zhangsan") fmt.Println("改:", resultUpdate, err) // 查(原生) resultSelectRaw, err := userDao.Where(userDao.ID.Eq(3)).First() fmt.Println("查(原生):", resultSelectRaw, err) // 查(自定义) resultSelectDiy, err := userDao.FilterWithName("zhangsan") fmt.Println("查(自定义):", resultSelectDiy, err) // 事务 query.Use(db).Transaction(func(tx *query.Query) error { if err := tx.User.Create(&model.User{ Name: "lee", }); err != nil { return err } if _, err := tx.User.Where(tx.User.ID.Eq(2)).Delete(); err != nil { return err } if _, err := tx.User.Where(tx.User.ID.Eq(3)).Update(tx.User.Name, "zhangsan"); err != nil { return err } return nil }) }
运行:
- 生成gen代码:
go run generate.go
- 运行:
go run main.go
- 生成gen代码:
(*推荐)用法二,使用 gentool 生成数据模型(先建表,后生成模型):
安装:
# 安装 gen go get gorm.io/gen # 安装 gentool go install gorm.io/gen/tools/gentool@latest
使用:
目录结构:
|—— test/ // 根目录 ****|—— config/ ********|—— config.go // 配置文件 ****|—— config.yaml // gentool 配置文件 ****|—— main.go // 入口文件 ****|—— go.mod // go module文件
go.mod:
module test
config.go:
package config import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func NewDB() *gorm.DB { dsn := "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local" db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{}) return db }
config.yaml:
version: "0.1" database: dsn: "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local" db: "mysql" #tables: "" outPath: "./query" outFile: "" withUnitTest: false modelPkgName: "" fieldNullable: false fieldWithIndexTag: true fieldWithTypeTag: true
main.go:
package main import ( "context" "fmt" "test/config" "test/model" "test/query" ) func main() { ctx := context.Background() db := config.NewDB() user := query.Use(db).User userDao := user.WithContext(ctx) // 增 err := userDao.Create(&model.User{ Name: "lee", }) fmt.Println("增:", err) // 删 resultDelete, err := userDao.Where(user.ID.Eq(1)).Delete() fmt.Println("删:", resultDelete, err) // 改 resultUpdate, err := userDao.Where(user.ID.Eq(2)).Update(user.Name, "zhangsan") fmt.Println("改:", resultUpdate, err) // 查 resultSelectRaw, err := userDao.Where(user.ID.Eq(3)).First() fmt.Println("查(原生):", resultSelectRaw, err) // 事务 query.Use(db).Transaction(func(tx *query.Query) error { txWithCtx := tx.User.WithContext(ctx) if err := txWithCtx.Create(&model.User{ Name: "lee", }); err != nil { return err } if _, err := txWithCtx.Where(tx.User.ID.Eq(2)).Delete(); err != nil { return err } if _, err := txWithCtx.Where(tx.User.ID.Eq(3)).Update(tx.User.Name, "zhangsan"); err != nil { return err } return nil }) }
运行:
- 生成gen代码:
gentool -c config.yaml
- 运行:
go run main.go
- 生成gen代码:
文档更新时间: 2024-04-19 15:11 作者:lee