Python - расширение загрузки SQLite JSON1

Я хочу использовать расширение json1 для SQLite в Python. Согласно официальной документации, это должно быть загружаемое расширение. Я получил файл json1.c из источника и скомпилировал его в json1.so в соответствии с официальными инструкциями без каких-либо ошибок.

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

Проблема возникла, когда я попытался загрузить расширение в Python 2.7.12 (и 3.5.2) в соответствии с документацией sqlite3.

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

Я получил следующее сообщение об ошибке трассировки. Я запустил интерпретатор Python из папки с файлом json1.so. Даже если кажется, что из-за последнего двоеточия должно быть больше информации, ниже приводится полное сообщение об ошибке.

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

Действительно ли невозможно использовать json1 как загружаемое расширение в Python? Является ли мой единственный вариант перекомпиляции SQLite, pysqlite2 и т. Д., Как объясняется в этом сообщении в блоге Чарльза Лейфера?

РЕДАКТИРОВАТЬ:

Как оказалось, я получаю сообщение об ошибке, потому что на моей машине уже есть это и другие расширения уже включены. Действие включения уже включенного расширения вызвало ошибку. До сих пор на всех компьютерах Linux, к которым у меня есть доступ, уже включены расширения json1 и fts5 в SQLite, который поставляется с Python. Вы можете проверить, какие параметры компиляции были использованы, подключившись к базе данных SQLite и выполнив следующий запрос.

PRAGMA compile_options;

1 ответ

Вы можете запустить sqlite с python 3. Вот что у меня работает на моем Mac:

Сначала скомпилируйте загружаемое расширение:

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

затем используйте его в скрипте:

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

или в оболочке:

.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"}

Я хотел бы, чтобы это было проще. кажется, что загрузка расширений (а не встраивание их в sqlite при создании) имеет гораздо больше смысла. моя последняя проблема заключается в том, что я не могу скомпилировать расширение json1 на CentOS 6.

я написал руководство здесь: https://github.com/SMAPPNYU/smapphowto/blob/master/howto_get_going_with_sqlite_json1.md

РЕДАКТИРОВАТЬ: я в конечном итоге отказался от JSON1 для моих целей. Теперь я просто использую pysmap dump_to_csv для csv на основе столбцов, извлекая нужные поля, а затем dump_to_sqlite_db создаю обычную базу данных sqlite из этого csv. смотрите pysmap smapp_collection

Для тех, кто все еще пытается выяснить, как собрать расширение json1 из исходного кода, вот оно:

После загрузки последней версии исходного кода из репозитория SQLite, разархивируйте его, перейдите в его папку и запустите ./configure,

Затем добавьте следующее к сгенерированному Makefile:

json1.dylib: json1.lo  
    $(LTCOMPILE) -c $(TOP)/ext/misc/json1.c  
    $(TCC) -shared -o json1.dylib json1.o  

make привередливы, так что будьте уверены $(LTCOMPILE) а также $(TCC) предшествует табуляция, а не пробелы!

Тогда беги make json1.dylib

Ссылка: https://burrows.svbtle.com/build-sqlite-json1-extension-as-shared-library-on-os-x

Другие вопросы по тегам