2016-09-04 40 views
6

Tôi muốn sử dụng phần mở rộng json1 cho SQLite trong Python. Theo số official documentation, nó phải là tiện ích có thể tải. Tôi đã nhận được tập tin json1.c từ source và biên dịch nó thành json1.so theo official instructions mà không có bất kỳ lỗi nào.Python - phần mở rộng tải JSON1 SQLite

$ gcc -g -fPIC -shared json1.c -o json1.so 

Sự cố xảy ra khi tôi cố tải tiện ích mở rộng bằng Python 2.7.12 (và 3.5.2) theo sqlite3 documentation.

>>> import sqlite3 
>>> con = sqlite3.connect(":memory:") 
>>> con.enable_load_extension(True) 
>>> con.load_extension("./json1.so") 

Tôi đã nhận được thông báo lỗi truy xuất sau. Tôi chạy trình thông dịch Python từ thư mục với tệp json1.so trong đó. Mặc dù có vẻ như có nhiều thông tin hơn do dấu hai chấm cuối cùng, sau đây là thông báo lỗi hoàn chỉnh.

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: error during initialization: 

Thực sự không thể sử dụng json1 làm tiện ích có thể tải trong Python? Là lựa chọn duy nhất của tôi để biên dịch lại SQLite, pysqlite2, vv như được giải thích trong this bài đăng blog của Charles Leifer?

EDIT:

Hóa ra, tôi đã gặp lỗi vì máy của tôi đã có tiện ích này và các tiện ích mở rộng khác đã được bật. Hành động bật tiện ích mở rộng đã được kích hoạt đã kích hoạt lỗi. Cho đến nay, tất cả các máy tính Linux mà tôi có quyền truy cập đã có các phần mở rộng json1 và fts5 được kích hoạt trong SQLite đi kèm với Python. Bạn có thể kiểm tra các tùy chọn biên dịch nào đã được sử dụng bằng cách kết nối với cơ sở dữ liệu SQLite và chạy truy vấn sau đây.

PRAGMA compile_options; 

Trả lời

2

bạn có thể chạy SQLite với python 3. đây là những gì làm việc cho tôi trên mac của tôi:

đầu tiên biên dịch phần mở rộng có thể nạp được:

curl -O http://sqlite.org/2016/sqlite-src-3140100.zip 

unzip sqlite-src-3140100.zip 

gcc -g -fPIC -dynamiclib sqlite-src-3140100/ext/misc/json1.c -o json1 

sau đó sử dụng nó trong một kịch bản:

import sqlite3 
conn = sqlite3.connect('testingjson.db') 

#load precompiled json1 extension 
conn.enable_load_extension(True) 
conn.load_extension("./json1") 

# create a cursor 
c = conn.cursor() 

# make a table 
# create table NAME_OF_TABLE (NAME_OF_FIELD TYPE_OF_FIELD); 
c.execute('create table testtabledos (testfield JSON);') 

# Insert a row of data into a table 
c.execute("insert into testtabledos (testfield) values (json('{\"json1\": \"works\"}'));") 

# Save (commit) the changes 
conn.commit() 

# We can also close the connection if we are done with it. 
# Just be sure any changes have been committed or they will be lost. 
conn.close() 

hoặc trong vỏ:

.load json1 
CREATE TABLE test_table (id INTEGER, json_field JSON); 
# insert data into test table 
insert into test_table (id, json_field) values (1, json('{"name":"yvan"}')); 
insert into test_table (id, json_field) values (2, json('{"name":"sara"}')); 
#select json objects from the json column 
select * from test_table where json_extract("json_field", '$.name') is not null; 
1|{"name":"yvan"} 
2|{"name":"sara"} 

tôi ước điều này dễ dàng hơn. nó có vẻ như tải phần mở rộng (thay vì xây dựng chúng vào sqlite vào sáng tạo) làm cho rất nhiều ý nghĩa hơn. ấn bản mới nhất của tôi là tôi không thể có vẻ để biên dịch các phần mở rộng json1 trên CentOS 6.

tôi đã viết một hướng dẫn ở đây: https://github.com/SMAPPNYU/smapphowto/blob/master/howto_get_going_with_sqlite_json1.md

EDIT: i cuối cùng đã từ bỏ trên json1 cho các mục đích của tôi. tôi bây giờ chỉ cần sử dụng pysmap dump_to_csv để csv cột dựa trên bằng cách giải nén các lĩnh vực tôi muốn, và sau đó dump_to_sqlite_db tạo một db sqlite bình thường từ đó csv. xem pysmap smapp_collection

+0

Tải xuống nguồn đã hoạt động nhưng đã trả về lỗi khi tôi cố biên dịch. –

+3

Nó giống như sau: '/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/../../../../lib/crt1.o: Trong hàm '_start' : (.text + 0x20): tham chiếu không xác định đối với 'main' collect2: lỗi: ls trả về 1 trạng thái thoát'. Tuy nhiên, tôi thấy một người khác có vấn đề của tôi nhưng họ giải quyết nó bằng cách tìm ra rằng nó đã được nạp và kích hoạt. Nếu phát hiện ra thông qua 'pragma compile_options' và chỉ cần thử nó, json1 đã được nạp và kích hoạt cho tôi! Xin lỗi vì nhận xét đôi. –

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