2014-10-04 27 views
2

在旅途中,你调用一个数据库打开与golang数据库开放功能歧义

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函数的优点是什么?

回答

1

好视docs状态...

数据库连接通过直接或使用“sqlite3的”数据库/ SQL驱动程序使用此包创建。下面介绍的直接接口公开了SQLite特有的功能,如增量I/O和联机备份。当您的应用程序需要支持多个数据库引擎时,建议使用该驱动

...当你想sqlite的具体功能(你用例),你可以使用sqlite3的连接和通用的数据库连接您将使用数据库驱动程序(代码)。

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

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