id: sql-integration

title: sql.DB Integration

下面的示例将说明如何将自定义 sql.DB对象传递给 ent.Client.

配置 sql.DB

方法一:

  1. package main
  2. import (
  3. "time"
  4. "<your_project>/ent"
  5. "github.com/facebookincubator/ent/dialect/sql"
  6. )
  7. func Open() (*ent.Client, error) {
  8. drv, err := sql.Open("mysql", "<mysql-dsn>")
  9. if err != nil {
  10. return nil, err
  11. }
  12. // 获取驱动的底层 sql.DB 对象。
  13. db := drv.DB()
  14. db.SetMaxIdleConns(10)
  15. db.SetMaxOpenConns(100)
  16. db.SetConnMaxLifetime(time.Hour)
  17. return ent.NewClient(ent.Driver(drv)), nil
  18. }

方法二:

  1. package main
  2. import (
  3. "database/sql"
  4. "time"
  5. "<your_project>/ent"
  6. entsql "github.com/facebookincubator/ent/dialect/sql"
  7. )
  8. func Open() (*ent.Client, error) {
  9. db, err := sql.Open("mysql", "<mysql-dsn>")
  10. if err != nil {
  11. return nil, err
  12. }
  13. db.SetMaxIdleConns(10)
  14. db.SetMaxOpenConns(100)
  15. db.SetConnMaxLifetime(time.Hour)
  16. // Create an ent.Driver from `db`.
  17. // 从 `db` 创建一个 ent.Driver.
  18. drv := entsql.OpenDB("mysql", db)
  19. return ent.NewClient(ent.Driver(drv)), nil
  20. }

在 MySQL 中使用 Opencensus

译者注:OpenCensus 是 Google 开源的一个用来收集和追踪应用程序指标的第三方库。目前 Opencensus 已经与 OpenTracing 合并

  1. package main
  2. import (
  3. "context"
  4. "database/sql"
  5. "database/sql/driver"
  6. "<project>/ent"
  7. "contrib.go.opencensus.io/integrations/ocsql"
  8. "github.com/go-sql-driver/mysql"
  9. entsql "github.com/facebookincubator/ent/dialect/sql"
  10. )
  11. type connector struct {
  12. dsn string
  13. }
  14. func (c connector) Connect(context.Context) (driver.Conn, error) {
  15. return c.Driver().Open(c.dsn)
  16. }
  17. func (connector) Driver() driver.Driver {
  18. return ocsql.Wrap(
  19. mysql.MySQLDriver{},
  20. ocsql.WithAllTraceOptions(),
  21. ocsql.WithRowsClose(false),
  22. ocsql.WithRowsNext(false),
  23. ocsql.WithDisableErrSkip(true),
  24. )
  25. }
  26. // 打开新的连接并启动统计记录器。
  27. func Open(dsn string) *ent.Client {
  28. db := sql.OpenDB(connector{dsn})
  29. // 从 `db` 创建一个 ent.Driver.
  30. drv := entsql.OpenDB("mysql", db)
  31. return ent.NewClient(ent.Driver(drv))
  32. }