【问题标题】:Choose an SQL driver at runtime in Golang when drivers have the same name当驱动程序具有相同名称时,在 Golang 中选择运行时 SQL 驱动程序
【发布时间】: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


【解决方案1】:

由于mailru/go-clickhouse的第2版可以同时使用它们,作者已将驱动名称更改为chhttp:https://github.com/mailru/go-clickhouse/issues/151

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多