2014-10-04 46 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數據庫 - >通用驅動程序。