web-dev-qa-db-ja.com

Python --SQLiteJSON1ロード拡張機能

Python内でSQLiteのjson1拡張機能を使用したいと思います。 公式ドキュメント によると、ロード可能な拡張機能である必要があります。 source からjson1.cファイルを取得し、 公式の指示 に従ってエラーなしでjson1.soにコンパイルしました。

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

sqlite3のドキュメント に従って、拡張機能をPython 2.7.12(および3.5.2)にロードしようとしたときに問題が発生しました。

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

次のトレースバックエラーメッセージが表示されました。 json1.soファイルが含まれているフォルダーからPythonインタープリターを実行しました。最後のコロンのために詳細情報があるはずですが、以下は完全なエラーメッセージです。

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

Python内でロード可能な拡張機能としてjson1を使用することは実際には不可能ですか? Charles Leiferによる this ブログ投稿で説明されているように、SQLite、pysqlite2などを再コンパイルする唯一のオプションはありますか?

編集:

結局のところ、私のマシンではすでにこれと他の拡張機能がすでに有効になっているため、エラーが発生していました。すでに有効になっている拡張機能を有効にするアクションにより、エラーが発生しました。これまでのところ、私がアクセスできるすべてのLinuxコンピューターでは、Pythonに付属のSQLiteでjson1およびfts5拡張機能がすでに有効になっています。 SQLiteデータベースに接続して次のクエリを実行すると、使用されているコンパイルオプションを確認できます。

PRAGMA compile_options;
9
Ali Kakakhel

あなたは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()

またはシェル内:

.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に組み込むのではなく)ロードする方がはるかに理にかなっているようです。私の最新の問題は、CentOS6でjson1拡張機能をコンパイルできないようです。

私はここにガイドを書きました: https://github.com/SMAPPNYU/smapphowto/blob/master/howto_get_going_with_sqlite_json1.md

編集:私は最終的に私の目的のためにjson1をあきらめました。必要なフィールドを抽出して列ベースのcsvにpysmap dump_to_csv を使用し、次に dump_to_sqlite_db そのcsvから通常のsqlitedbを作成します。 pysmap smapp_collection を参照してください

3
yvanscher

ソースコードからjson1拡張機能を構築する方法をまだ理解しようとしている人のために、ここにあります:

最新リリースのソースコードSQLiteソースリポジトリ からダウンロードした後、解凍し、フォルダに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

0
Emrah Diril