提问人:Manticore 提问时间:11/11/2023 更新时间:11/11/2023 访问量:48
我怎样才能成为 Gorm 和 Sqlx 的朋友?
How can I befriend Gorm and Sqlx?
问:
我有一个基于 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.DB
Conn
gorm.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 的分支并添加缺失的功能吗?
答: 暂无答案
评论