sqlite3
hỗ trợ bằng Python có thể là một chút bối rối. Bộ điều hợp cơ sở dữ liệu sqlite bắt đầu như một dự án riêng biệt, pysqlite2, nhưng đối với Python 2.5, phiên bản của nó được tích hợp vào thư viện chuẩn Python dưới tên sqlite3. Bộ tiếp hợp ban đầu tiếp tục được phát triển như dự án riêng biệt đó trong khi định kỳ phiên bản trong bản thân Python được cập nhật để phù hợp với nó. Nếu bạn đang cố gắng sử dụng phiên bản mới hơn của bộ điều hợp, nó thường được cài đặt là pysqlite2
để không xung đột với phiên bản được bao gồm trong thư viện chuẩn. Và, tùy thuộc vào cách nó được xây dựng, nó có thể liên kết đến một phiên bản khác nhau của cơ sở sqlite3 database library. Vì vậy, hãy chắc chắn rằng bạn đang nhập nó đúng cách:
>>> 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
là phiên bản của sqlite3
(pysqlite2
hay built-in sqlite3
) bộ chuyển đổi cơ sở dữ liệu. sqlite_version_info
là phiên bản của thư viện cơ sở dữ liệu cơ bản sqlite3
.
Sử dụng from ... import ... as sqlite3
được đề xuất để phần còn lại của mã của bạn không cần phải thay đổi nếu bạn di chuyển từ phiên bản này sang phiên bản khác.
Lưu ý, enable_load_extension
xuất hiện lần đầu tiên trong pysqlite2
2.5.0.
EDIT:enable_load_extension
bị tắt theo mặc định khi bạn tạo bộ điều hợp. Để bật tính năng này, bạn có thể tạo pysqlite2
theo cách thủ công. Công thức sau đây giả định hệ thống unix
và phiên bản mới nhất của pysqlite2
, theo văn bản này là 2.5.5.
Thứ nhất, nếu bạn cài đặt các bộ chuyển đổi ban đầu qua easy_install
, gỡ bỏ cài đặt nó bằng cách chạy đầu tiên:
$ sudo /path/to/easy_install -m pysqlite # or whatever package name you first used
Sẽ có một số đầu ra từ đó bao gồm dòng thích:
Removing pysqlite 2.5.5 from easy-install.pth file
Using /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg
Tháo trứng sử dụng tên tệp được liệt kê (tên sẽ khác nhau tùy thuộc vào nền tảng và phiên bản của bạn và tên này có thể là tệp hoặc thư mục):
$ sudo rm -r /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg
Bây giờ tải về và giải nén pysqlite-2.5.5
nguồn tarball:
$ 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
Sau đó chỉnh sửa các tập tin setup.cfg
nhận xét ra SQLITE_OMIT_LOAD_EXTENSION
chỉ:
$ ed setup.cfg <<EOF
> /SQLITE_OMIT_LOAD_EXTENSION/s/define=/#define=/
> w
> q
> EOF
Kể từ khi phiên bản của sqlite3
rất cũ (3.4.0), bạn cũng nên xây dựng với thư viện sqlite3
mới nhất. Này được thực hiện dễ dàng trong kịch bản pysqlite2
setup.py:
$ /path/to/python2.x setup.py build_static
này sẽ tự động tải về mới nhất của sqlite3 amalgamation source và xây dựng các bộ chuyển đổi cùng với một phiên bản tĩnh liên kết up-to-date của sqlite3
. Bước này có thể mất nhiều thời gian để hoàn thành.
UPDATE (2015/07/21): Theo mới nhất pysqlite 2.6.3 commit bạn phải tải về mã nguồn sqlite một mình và đặt chúng trong thư mục gốc pysqlite.
Bây giờ, cài đặt các bộ chuyển đổi:
$ sudo /path/to/python2.x setup.py install
và chạy thử nghiệm:
$ cd # somewhere out of the build directory
$ /path/to/python2.x
>>> from pysqlite2 import test
>>> test.test()
và nếu họ vượt qua, bạn sẽ có tất cả các thiết lập.
Như một phần thưởng, nếu lý do bạn muốn hỗ trợ phần mở rộng tải là sử dụng phần mở rộng sqlite3
's tìm kiếm đầy đủ văn bản, FTS3
, bạn sẽ thấy rằng nó đã được bao gồm như là một phần của thư viện tĩnh và không có công việc tiếp theo là cần thiết:
>>> from pysqlite2 import dbapi2 as sqlite3
>>> con = sqlite3.connect(":memory:")
>>> con.execute("create virtual table recipe using fts3(name, ingredients)")
<pysqlite2.dbapi2.Cursor object at 0xca5e0>
Kính gửi Ned: Điều này chắc chắn đã giúp tôi rất nhiều - cảm ơn! Bây giờ kịch bản python của tôi dường như tải phiên bản mới nhất của bộ điều hợp sau khi sử dụng cấu trúc 'from ... import ... as sqlite3', khi tôi nhận được 2.5.5 cho version_info và 3.4.0 cho sqlite_version. Tuy nhiên, một dòng hơn nữa tôi cố gắng sử dụng 'enable_load_extension' và bây giờ tôi nhận được: AttributeError: 'pysqlite2.dbapi2.Connection' đối tượng không có thuộc tính 'enable_load_extension' Bởi tất cả các thông tin bạn đã cho tôi, điều này có vẻ đáng ngạc nhiên , không? Cảm ơn bạn rất nhiều vì đã giúp bạn rất nhiều - thực sự được đánh giá cao! --Albert – Albert
Darn! Tôi đã mở rộng câu trả lời để bao gồm làm thế nào để xây dựng các bộ chuyển đổi với hỗ trợ mở rộng tải được kích hoạt và với một phiên bản up-to-date của thư viện sqlite3. –
Ned, cảm ơn bạn đã trả lời nhanh chóng. Tôi đã làm theo hướng dẫn của bạn theo nghĩa đen. Hệ thống của tôi hiện có phiên bản sqlite3 mới nhất. Tuy nhiên, nếu tôi nhập 'từ thử nghiệm nhập pysqlite2', tôi nhận được lỗi sau: từ nhập pysqlite2._sqlite * NhậpError: dlopen (/Library/Python/2.5/site-packages/pysqlite2/_sqlite.so, 2) : Biểu tượng không tìm thấy: _sqlite3_enable_load_extension Tham chiếu từ: /Library/Python/2.5/site-packages/pysqlite2/_sqlite.so Mong đợi: tra cứu động :(, xin lỗi vì đã làm phiền bạn một lần nữa với điều này. Tôi cảm thấy tôi rất đóng ngay bây giờ ... Cảm ơn rất nhiều (!) cho tất cả sự giúp đỡ của bạn cho đến nay, Albert – Albert