GORM

Example

项目地址GORM - 图1 (opens new window)

GORM配置

  1. type Config struct {
  2. Dialect string // 选择数据库种类,默认mysql
  3. DSN string // DSN地址: mysql://root:secret@tcp(127.0.0.1:3306)/mysql?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&loc=Local&timeout=1s&readTimeout=3s&writeTimeout=3s
  4. Debug bool // 是否开启调试,默认不开启,开启后并加上export EGO_DEBUG=true,可以看到每次请求,配置名、地址、耗时、请求数据、响应数据
  5. RawDebug bool // 是否开启原生调试开关,默认不开启
  6. MaxIdleConns int // 最大空闲连接数,默认10
  7. MaxOpenConns int // 最大活动连接数,默认100
  8. ConnMaxLifetime time.Duration // 连接的最大存活时间,默认300s
  9. OnFail string // 创建连接的错误级别,=panic时,如果创建失败,立即panic,默认连接不上panic
  10. SlowLogThreshold time.Duration // 慢日志阈值,默认500ms
  11. EnableMetricInterceptor bool // 是否开启监控,默认开启
  12. EnableTraceInterceptor bool // 是否开启链路追踪,默认开启
  13. EnableDetailSQL bool // 记录错误sql时,是否打印包含参数的完整sql语句,select * from aid = ?;
  14. EnableAccessInterceptor bool // 是否开启,记录请求数据
  15. EnableAccessInterceptorReply bool // 是否开启记录响应参数
  16. EnableAccessInterceptorReq bool // 是否开启记录请求参数
  17. }

用户配置

  1. [mysql.test]
  2. debug = true # ego重写gorm debug,打开后可以看到,配置名、地址、耗时、请求数据、响应数据
  3. dsn = "root:root@tcp(127.0.0.1:3306)/ego?charset=utf8&parseTime=True&loc=Local&readTimeout=1s&timeout=1s&writeTimeout=3s"

优雅的Debug

通过开启debug配置和命令行的export EGO_DEBUG=true,我们就可以在测试环境里看到请求里的配置名、地址、耗时、请求数据、响应数据 image 当然你也可以开启gorm原生的调试,将rawDebug设置为true

用户代码

TIP

客户端组件均使用go mod子包管理,使用该组件,一定要使用下面的go get命令

  1. go get github.com/gotomicro/ego-component/egorm

配置创建一个 gorm 的配置项,其中内容按照上文配置进行填写。以上这个示例里这个配置key是gorm.test

代码中创建一个 gorm 实例 egorm.Load("key").Build(),代码中的 key 和配置中的 key 要保持一致。创建完 gorm 实例后,就可以直接使用他对 db 进行 crud

  1. package main
  2. import (
  3. "github.com/gotomicro/ego"
  4. "github.com/gotomicro/ego-component/egorm"
  5. "github.com/gotomicro/ego/core/elog"
  6. )
  7. /**
  8. 1.新建一个数据库叫test
  9. 2.执行以下example,export EGO_DEBUG=true && go run main.go --config=config.toml
  10. */
  11. type User struct {
  12. Id int `gorm:"not null" json:"id"`
  13. Nickname string `gorm:"not null" json:"name"`
  14. }
  15. func (User) TableName() string {
  16. return "user2"
  17. }
  18. func main() {
  19. err := ego.New().Invoker(
  20. openDB,
  21. testDB,
  22. ).Run()
  23. if err != nil {
  24. elog.Error("startup", elog.Any("err", err))
  25. }
  26. }
  27. var gormDB *egorm.Component
  28. func openDB() error {
  29. gormDB = egorm.Load("mysql.test").Build()
  30. models := []interface{}{
  31. &User{},
  32. }
  33. gormDB.SingularTable(true)
  34. gormDB.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(models...)
  35. gormDB.Create(&User{
  36. Nickname: "ego",
  37. })
  38. return nil
  39. }
  40. func testDB() error {
  41. var user User
  42. err := gormDB.Where("id = ?", 100).Find(&user).Error
  43. elog.Info("user info", elog.String("name", user.Nickname))
  44. return err
  45. }