【问题标题】:golang database Open function ambiguitygolang数据库开放函数歧义
【发布时间】:2014-10-07 23:32:09
【问题描述】:

在 go 中,你调用一个用

打开的数据库
DB, err = sql.Open("sqlite3", "./bar.db")

这会返回一个*sql.DB类型的数据库,函数和类型都是database/sql的成员。

但是,在 sqlite3 驱动程序包中,还有另一个 Open 函数返回 *sqlite3.Conn 类型。

我注意到sqlite3 驱动程序包中定义的一些函数在使用默认database/sql 打开的数据库上不起作用。

另外,sqlite3包中有一些函数与database/sql的函数类似,分别是QueryExec,返回的类型不同。

database/sql 包含一个函数Query,它返回类型*sql.Rows

mxk/sqlite/sqlite3mattn/go-sqlite3 都有一个 Query 函数,它们返回完全不同的类型。

我想在我的数据库连接上运行诸如mxk/sqlite/sqlite3BusyTimeout 之类的函数,但它不是正确的类型。我是否必须重新编写所有代码才能打开与 sqlite3 驱动程序的数据库连接,而不是使用database/sqlOpen?如果您不能将驱动程序的任何功能与该通用连接一起使用,那么database/sqlOpen 功能有什么优势?

【问题讨论】:

    标签: sql sqlite go


    【解决方案1】:

    嗯,作为docs 状态...

    数据库连接可以通过直接使用此包或使用“sqlite3”数据库/sql 驱动程序来创建。下面描述的直接接口公开了 SQLite 特定的功能,例如增量 I/O 和在线备份。当您的应用程序必须支持多个数据库引擎时,建议使用该驱动程序。

    ...当您需要 sqlite 特定 函数(您的用例)时,您将使用 sqlite3 连接,而对于通用数据库连接,您将使用数据库驱动程序(您的代码)。

    这完全合乎逻辑,因为通用驱动程序将如何处理特定于各种数据库的函数?运行时错误?

    所以你有一个选择:所有 sqlite 函数 -> sqlite conn 或处理多个 sql 数据库 -> 通用驱动程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      相关资源
      最近更新 更多