sqlite3支援在Python中可能有點混亂。 sqlite資料庫擴充卡作為一個單獨的項目
pysqlite2開始,但對于Python 2.5,它的一個版本被合并到名為
sqlite3的Python标準庫中。原始的擴充卡繼續作為單獨的項目開發,而定期的Python版本本身被更新以比對它。如果您嘗試使用較新版本的擴充卡,它通常安裝為pysqlite2,以免與标準庫中包含的版本沖突。而且,根據它是如何建構的,它可能連結到底層
sqlite3 database library的不同版本。是以,請確定您正确導入它:
>>> import sqlite3
>>> sqlite3.version_info
(2, 4, 1)
>>> sqlite3.sqlite_version_info
(3, 6, 11)
>>> from pysqlite2 import dbapi2 as sqlite3
>>> sqlite3.version_info
(2, 5, 5)
>>> sqlite3.sqlite_version_info
(3, 6, 18)
version_info是sqlite3(pysqlite2或内置的sqlite3)資料庫擴充卡的版本。
sqlite_version_info是底層sqlite3資料庫庫的版本。
使用from … import … as sqlite3建議,這樣,如果你從一個版本移動到另一個版本,其餘的代碼不需要更改。
注意,enable_load_extension首次出現在pysqlite2 2.5.0中。
編輯:預設情況下,在建構擴充卡時禁用enable_load_extension。要啟用它,您可以手動建構pysqlite2。下面的配方假設一個unix-y系統和pysqlite2的最新版本,在本文寫作是2.5.5。
首先,如果您最初通過easy_install安裝擴充卡,請先解除安裝它,首先運作:
$ sudo /path/to/easy_install -m pysqlite # or whatever package name you first used
将有一些輸出,包括如下行:
Removing pysqlite 2.5.5 from easy-install.pth file
Using /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg
使用列出的檔案名删除雞蛋(名稱将取決于您的平台和版本,它可能會引用一個檔案或目錄):
$ sudo rm -r /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg
現在下載下傳并提取pysqlite-2.5.5源碼包:
$ mkdir /tmp/build
$ cd /tmp/build
$ curl http://oss.itsystementwicklung.de/download/pysqlite/2.5/2.5.5/pysqlite-2.5.5.tar.gz | tar xz
$ cd pysqlite-2.5.5
然後編輯setup.cfg檔案以注釋掉SQLITE_OMIT_LOAD_EXTENSION指令:
$ ed setup.cfg <
> /SQLITE_OMIT_LOAD_EXTENSION/s/define=/#define=/
> w
> q
> EOF
由于sqlite3的版本是如此老(3.4.0),你也應該使用最新的sqlite3庫。這在pysqlite2 setup.py腳本中很容易:
$ /path/to/python2.x setup.py build_static
這将自動下載下傳最新的sqlite3 amalgamation source和建構擴充卡以及一個最新的靜态連結版本的sqlite3。此步驟可能需要很長時間才能完成。
UPDATE(2015/07/21):根據最新的pysqlite 2.6.3 commit,你必須自己下載下傳sqlite源代碼,并将它們放在pysqlite根檔案夾。
現在,安裝擴充卡:
$ sudo /path/to/python2.x setup.py install
并運作測試:
$ cd # somewhere out of the build directory
$ /path/to/python2.x
>>> from pysqlite2 import test
>>> test.test()
如果他們通過,你應該全部設定。
作為獎勵,如果你想要加載擴充支援的原因是使用sqlite3的全文搜尋擴充,FTS3,你應該發現它被包括作為靜态庫的一部分,不需要進一步的工作:
>>> from pysqlite2 import dbapi2 as sqlite3
>>> con = sqlite3.connect(":memory:")
>>> con.execute("create virtual table recipe using fts3(name, ingredients)")