¿Es posible almacenar y consultar JSON en SQLite?


35

Necesito almacenar objetos JSON en una base de datos SQLite, y luego hacer consultas complejas sobre él.

Hice una mesa como esta:

+--------------------------------------+
|document |  property | string | number|
+--------------------------------------+
|foo      |  "title"  | "test" |       | 
+--------------------------------------+
|foo      |  "id"     |        |  42   | 
+--------------------------------------+
|bar      |  "id"     |        |  43   | 
+--------------------------------------+

para los dos objetos

foo {"title": "test", "id": 42} 
bar {id: 43}

Pero no puedo hacer consultas "Y", como:

SELECT DISTINCT id  FROM table WHERE title = "test" AND id = 42 

Como puede ver, la parte después del "DÓNDE" no tiene sentido, pero no tengo idea de cómo crear una consulta que haga lo que quiero.

Entonces, ¿crees que hay una mejor manera de almacenar mis datos o una solución alternativa para hacer una consulta "Y"?

Y, por supuesto, el JSON puede contener cualquier propiedad, por lo que no puedo crear una tabla con columnas para cada propiedad.

Estoy usando WebSQL, que es SQLite sin extensiones.

Sé que mi pregunta es bastante específica, pero ¿podrían ayudarme?


2
Si eso es realmente importante para su aplicación, probablemente sea mejor usar un almacén de documentos real ("NoSQL") o, por ejemplo, cambiar a Postgres, que combina un almacenamiento JSON muy eficiente con características relacionales sólidas.
a_horse_with_no_name


@CL. Yupp Ese es también el primer resultado cuando buscas en Google "sqlite json" :)
Izzy


@Izzy Antes que nada, para mí al menos esta pregunta es ahora el primer resultado, no los documentos. En segundo lugar, esa extensión no es una buena respuesta para OP, quien declaró explícitamente el uso de 'WebSQL, que es SQLite sin extensiones'.
OJFord

Respuestas:


35

SQLite 3.9 introdujo una nueva extensión ( JSON1 ) que le permite trabajar fácilmente con datos JSON.

Además, introdujo soporte para índices en expresiones , que (según tengo entendido) también debería permitirle definir índices en sus datos JSON.


7

PostgreSQL tiene algunas características agradables para el almacenamiento JSON. Puede seleccionar los valores JSON haciendo

SELECT DISTINCT FROM TABLE WHERE foo->title=test AND id=42

También puede indexar las claves específicas en el objeto JSON si usa el jsonbtipo.


5

Las respuestas existentes para este acuerdo en realidad almacenan los datos del OP como JSON (que puede haber sido una mejor solución a su problema subyacente).

Sin embargo, la pregunta real era cómo encontrar documentos en la tabla de estilo EAV proporcionada, basada en múltiples propiedades. Entonces, quizás una respuesta a esa pregunta sería útil.

La forma estándar de SQL de hacer lo que está diciendo es INTERSECCIÓN.

(SELECT document FROM table WHERE property="id" AND number=43)
INTERSECTION 
(SELECT document FROM table WHERE property="title" AND string="test")

También puede hacer esto con autouniones si lo prefiere.

SELECT t1.document
FROM table as t1, table as t2
WHERE t1.document = t2.document
AND t1.property="id" AND t1.number=43
AND t2.property="title" AND t2.string="test"

Por supuesto, la forma más "correcta" y posiblemente más eficiente sería simplemente hacer una columna para cada propiedad que necesite, como 'id' y 'título'.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.