2009-10-09 24 views
29

Thông báo lỗi tôi đang cố gắng để có được thoát khỏi là:Force Python để bỏ sqlite3 nguồn gốc và sử dụng (cài đặt) phiên bản mới nhất sqlite3

AttributeError: 'sqlite3.Connection' object has no attribute 'enable_load_extension'

Tôi có 'easy_install'-ed phiên bản mới nhất và sqlite3 python bằng cách nào đó biết nó là có kể từ khi sqlite3.version_info sản xuất 3.6.13. Trong phiên bản này, Connection phải có thuộc tính 'enable_load_extension'.

Điều tôi nghĩ đang xảy ra là python vẫn sử dụng mô-đun sqlite3 gốc mà tôi nghĩ là 2.4.1 kể từ sqlite3.version (ví dụ: sqlite3.version_info) tạo 2.4.1.

Câu hỏi đặt ra là làm cách nào để buộc python sử dụng mô-đun sqlite3 mới cho tất cả các cuộc gọi sqlite3?

Trả lời

63

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> 
+0

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

+0

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. –

+0

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

3

Bạn cần phải nhìn vào đường dẫn Python của bạn và đảm bảo rằng sqlite bạn muốn được cài đặt trong một thư mục trước đó hơn là xây dựng trong sqlite.

Bạn có thể thấy đường dẫn với:

import sys 
print sys.path 

Nếu bạn muốn tìm hiểu nơi một module là từ, hãy thử:

print sqlite3.__file__ 
+0

Kính gửi Ned: Điều này rất hữu ích - cảm ơn rất nhiều! Tôi cảm thấy tôi gần gũi hơn bây giờ để giải quyết hoàn toàn vấn đề sau khi bình luận của bạn và bài bình luận được đăng bởi Ned Deily. --Albert – Albert

13

Tôi có python 2.7 trên máy tính windows và sqlite3.sqlite_version dựng sẵn là 3.6.x. Bằng cách thực hiện các bước sau tôi đã có thể làm cho nó sử dụng sqlite 3.7.9.

  1. Tải về và giải nén DLL nhị phân trước biên dịch ("sqlite-dll-win32-x86-3070900.zip" trên http://www.sqlite.org/download.html)
  2. (có lẽ nên đóng tất cả các trường hợp của python vào thời điểm này chỉ để được an toàn) Đi đến C: \ Python27 \ DLLs và thay đổi tên tệp của "sqlite3.dll" thành "sqlite3.dll.old"
  3. Sao chép tệp "sqlite3.dll" đến thư mục C: \ Python27 \ DLL
  4. mở python vỏ và nhập khẩu sqlite3
  5. Xác sqlite3.sqlite_version xuất hiện như '3.7.9'
+0

Cảm ơn Will. Tuy nhiên tôi tự hỏi nếu không có nguy cơ không tương thích giữa sqlite3.dll mới và python 2.7.? mã gói sqlite3. Tôi cho rằng gói sqlite3 đã được thử nghiệm với một sqlite3.dll cụ thể và API của nó có thể phát triển theo thời gian. Có lẽ bạn đã may mắn với những phiên bản cụ thể và các kịch bản thử nghiệm ... Hoặc có một bộ thử nghiệm? – dim

+0

Hi Dim, tôi đã không làm bất kỳ thử nghiệm nào, vì vậy tôi có thể may mắn! –

+0

Làm việc tốt cho tôi. –

3

Thay vì tiêu chuẩn Python sqlite3 module, bạn có thể sử dụng mô-đun apsw, một mô-đun SQLite của bên thứ ba tuân thủ chặt chẽ hơn API SQLite, bao gồm hỗ trợ tải các phần mở rộng, cũng như về cơ bản mọi thứ được cho phép trong API C/C++ của SQLite. nhiều nhất có thể để cập nhật mọi thay đổi mới trong SQLite.

Các vấn đề liên quan