Python – extensión de carga SQLite JSON1

Quiero usar la extensión json1 para SQLite en Python. Según la documentación oficial , debe ser una extensión cargable. Obtuve el archivo json1.c de la fuente y lo compilé en json1.so según las instrucciones oficiales sin ningún error.

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

El problema surgió cuando intenté cargar la extensión en Python 2.7.12 (y 3.5.2) de acuerdo con la documentación de sqlite3 .

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

Recibí el siguiente mensaje de error de rastreo. Ejecuté el intérprete de Python desde la carpeta con el archivo json1.so en él. A pesar de que parece que debería haber más información debido a los últimos dos puntos, el siguiente es el mensaje de error completo.

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

¿Realmente no es posible usar json1 como una extensión cargable dentro de Python? ¿Es mi única opción recomstackr SQLite, pysqlite2, etc., como se explica en esta publicación del blog de Charles Leifer?

EDITAR:

Resulta que estaba recibiendo el error porque mi máquina ya tenía esta y otras extensiones ya habilitadas. La acción de habilitar una extensión ya habilitada provocó el error. Hasta ahora, todas las computadoras Linux a las que tengo acceso ya tienen las extensiones json1 y fts5 habilitadas en el SQLite que viene con Python. Puede verificar qué opciones de comstackción se han usado conectándose a una base de datos SQLite y ejecutando la siguiente consulta.

 PRAGMA compile_options; 

puedes ejecutar sqlite con python 3. esto es lo que funcionó para mí en mi mac:

primero comstack la extensión cargable:

 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 

luego usarlo en un script:

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

o en una concha:

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

Desearía que esto fuera más fácil. Parece que cargar extensiones (en lugar de construirlas en sqlite en la creación) tiene mucho más sentido. Mi último problema es que parece que no puedo comstackr la extensión json1 en CentOS 6.

Escribí una guía aquí: https://github.com/SMAPPNYU/smapphowto/blob/master/howto_get_going_with_sqlite_json1.md

EDIT: finalmente me di por vencido en json1 para mis propósitos. ahora solo uso pysmap dump_to_csv para csv basado en columnas al extraer los campos que quiero, y luego dump_to_sqlite_db crea una base de datos sqlite normal a partir de ese csv. ver pysmap smapp_collection

Para cualquier persona que aún esté intentando averiguar cómo construir la extensión json1 a partir del código fuente, aquí está:

Después de descargar el último código fuente de la versión de SQLite Source Repository , descomprímalo, cd en su carpeta y ejecute ./configure .

Luego agregue lo siguiente al Makefile generado:

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

make es meticuloso, así que asegúrese de que $(LTCOMPILE) y $(TCC) estén precedidos por TAB, no espacios!

A continuación, ejecute make json1.dylib

Referencia: https://burrows.svbtle.com/build-sqlite-json1-extension-as-shared-library-on-os-x