我想在Python中使用SQLite的json1扩展。根据{{3}},它应该是可加载的扩展。我从official documentation获得了json1.c文件,并根据source将其编译为json1.so,没有任何错误。
$ gcc -g -fPIC -shared json1.c -o json1.so
当我尝试根据official instructions在Python 2.7.12(和3.5.2)中加载扩展时出现问题。
>>> 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:
实际上不可能在Python中使用json1作为可加载扩展吗?我是唯一可以重新编译SQLite,pysqlite2等的选项,如Charles Leifer在sqlite3 documentation博客文章中所述?
编辑:
事实证明,我收到错误是因为我的机器已经启用了此功能和其他扩展功能。启用已启用的扩展的操作会触发错误。到目前为止,我可以访问的所有Linux计算机已经在Python附带的SQLite中启用了json1和fts5扩展。您可以通过连接到SQLite数据库并运行以下查询来检查已使用的编译选项。
PRAGMA compile_options;
答案 0 :(得分:3)
你可以用python 3运行sqlite。这是我在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()
或在shell中:
.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)更有意义。我最近的问题是我似乎无法在CentOS 6上编译json1扩展。
我在这里写了一个指南:https://github.com/SMAPPNYU/smapphowto/blob/master/howto_get_going_with_sqlite_json1.md
编辑:为了我的目的,我最终放弃了json1。我现在只需通过提取我想要的字段,将pysmap dump_to_csv用于基于列的csv,然后dump_to_sqlite_db从该csv创建一个普通的sqlite数据库。见pysmap smapp_collection答案 1 :(得分:0)
对于仍在尝试从源代码构建json1扩展的任何人,这里是:
从latest release source code下载SQLite Source Repository后,将其解压缩,cd放入其文件夹并运行./configure
。
然后将以下内容添加到生成的Makefile
中:
json1.dylib: json1.lo
$(LTCOMPILE) -c $(TOP)/ext/misc/json1.c
$(TCC) -shared -o json1.dylib json1.o
make
是挑剔的,因此请确保$(LTCOMPILE)
和$(TCC)
之前是TAB,而不是空格!
然后运行make json1.dylib
参考:https://burrows.svbtle.com/build-sqlite-json1-extension-as-shared-library-on-os-x