在go中,您可以调用使用打开的数据库
DB, err = sql.Open("sqlite3", "./bar.db")
这返回一个类型为*sql.DB
的数据库,函数和类型都是database/sql
的成员。
但是,在sqlite3驱动程序包中,还有另一个返回*sqlite3.Conn
类型的Open
函数。
我注意到sqlite3
驱动程序包中定义的一些函数在使用默认database/sql
打开的数据库上不起作用。
此外,sqlite3包中还有一些函数与database/sql
的函数类似,即Query
和Exec
,它们返回不同的类型。
database/sql
包含一个返回类型*sql.Rows
的函数Query
。
mxk/sqlite/sqlite3
和mattn/go-sqlite3
都有一个Query
函数,返回的类型完全不同。
我想在数据库连接上运行mxk/sqlite/sqlite3
的BusyTimeout
之类的函数,但它不是正确的类型。我是否必须重写所有代码才能使用sqlite3驱动程序打开数据库连接,而不是使用database/sql
的Open
?如果database/sql
的Open
函数不能与通用连接一起使用驱动程序的任何函数,那么它的优势是什么?
好吧,正如文档所说。。。
数据库连接可以直接使用此包创建,也可以使用"sqlite3"数据库/sql驱动程序创建。下面描述的直接接口公开了SQLite特定的功能,例如增量I/O和在线备份。当应用程序必须支持多个数据库引擎时,建议使用该驱动程序。
当您想要特定于sqlite的函数(您的用例)时,您将使用sqlite3连接,而对于通用数据库连接,则将使用数据库驱动程序(您的代码)。
这完全符合逻辑,因为通用驱动程序将如何处理特定于各种数据库的功能?运行时错误?
因此,您可以选择:所有sqlite函数->sqlite conn或处理多个sql数据库->通用驱动程序。