我怎样才能成为 Gorm 和 Sqlx 的朋友?

How can I befriend Gorm and Sqlx?

提问人:Manticore 提问时间:11/11/2023 更新时间:11/11/2023 访问量:48

问:

我有一个基于 GORM 的中型代码库,但我也想使用 Sqlx。如果你想问我为什么选择sqlx与gorm合作,答案是:易于调试,没有反射。

但是目前我无法重用 GORM 和 SQLX 之间的现有连接,因为它们不允许重用已经打开的连接。并且很难通过 2 个连接而不是 1 个连接进行操作。至少选项模式要求对两个对象执行相同的操作:GORM 和 SQLX。让我们举个例子:

type PostgreSQL struct {
    Gorm *gorm.DB
    Sqlx *sqlx.DB
    conn *sql.DB // it could be the same to Gorm and Sqlx
}

func NewPostgreSQL(dsn string, options ...func(*PostgreSQL)) (PostgreSQL, error) {
    gormdb, err := gorm.Open(postgres.Open(dsn))
    if err != nil {
        return PostgreSQL{}, err
    }

    sqlxdb, err := sqlx.Connect("postgres", dsn)
    if err != nil {
        return PostgreSQL{}, err
    }

    ps := &PostgreSQL{
        Gorm: gormdb,
        Sqlx: sqlxdb,
        conn: sqlxdb.DB, // I can't because it will only be applied on sqlxdb connection
    }
    for _, opt := range options {
        opt(ps)
    }

    return *ps, nil
}

func WithMaxIdleConns(conns int) func(*PostgreSQL) {
    return func(ps *PostgreSQL) {
        // This part of code could be simplified just to: ps.conn.SetMaxIdleConns(conns)
        db, err := ps.Gorm.DB()
        if err != nil {
            panic(err)
        }
        db.SetMaxIdleConns(conns)
        ps.Sqlx.SetMaxIdleConns(conns)
    }
}

而这只是冰山一角。

但是,我不明白为什么 GORM 不允许使用已经存在的连接(在新版本中,您在结构中没有字段)。
注意在网站上说:
*sql.DBConngorm.Config

现有数据库连接 GORM 允许初始化 *gorm。具有现有数据库连接的数据库

import (
  "database/sql"
  "gorm.io/driver/postgres"
  "gorm.io/gorm"
)

sqlDB, err := sql.Open("pgx", "mydb_dsn")
gormDB, err := gorm.Open(postgres.New(postgres.Config{
  Conn: sqlDB,
}), &gorm.Config{})

我也不知道为什么不允许重用现有的数据库连接。sqlx

也许这是因为一些我不知道的陷阱?我该怎么办?我应该制作 GORM 和 SQLX 的分支并添加缺失的功能吗?

SQL GO-GORM SQLX

评论

0赞 Brits 11/11/2023
请试着把它归结为一个问题(目前很难回答)。我怀疑 gorm “现有数据库连接” 和 SQLX NewDb 可能会给你一条前进的道路。
0赞 Peter 11/11/2023
“在新版本中,gorm 中没有 Conn 字段。配置”。它被命名为 ConnPool。也许你的印象是 *sql.DB 表示单个连接。“DB 是一个数据库句柄,表示零个或多个基础连接池。”

答: 暂无答案