天天看點

python自帶sqlite_強制Python放棄本地sqlite3并使用(已安裝)最新的sqlite3版本

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)")