【发布时间】:2022-03-28 22:53:39
【问题描述】:
我想知道当这两个驱动程序具有相同名称时,是否有一种方法或投影模式能够在运行时在 Golang 中选择 SQL 驱动程序。我想使用环境变量在 HTTP ClickHouse 驱动程序 (https://github.com/mailru/go-clickhouse) 和本机 TCP ClickHouse 驱动程序 (https://github.com/ClickHouse/clickhouse-go) 之间切换。
import(
//HTTP driver
_ "github.com/mailru/go-clickhouse"
)
func getHttpCHConnection() (*sql.DB, error) {
...
db, err := sql.Open("clickhouse", clkConnUrl)
import(
//Native driver
_ "github.com/ClickHouse/clickhouse-go"
)
func getNativeCHConnection() (*sql.DB, error) {
...
db, err := sql.Open("clickhouse", clkConnUrl)
通常,它会导致“恐慌:sql:为驱动程序 clickhouse 调用了两次注册”。可以避免吗?
【问题讨论】:
-
当然,当您打开连接时,您实际上是在提供要使用的驱动程序
sql.Open("mysql", dsn) -
我已经编辑了这个问题。忘了说了,主要的问题是这两个驱动都同名
-
不幸的是,
mailru/go-clickhouse的作者犯了一个巨大的错误;他们不应该使用与官方驱动程序相同的名称。 -
好吧,在处理相同数据库的两个驱动程序之间切换是没有意义的。所以我不会说问题出在库上,而是你的方法/设计。
-
我认为你最好的选择是分叉其中一个存储库并更改驱动程序名称。
标签: go microservices clickhouse clickhouse-go