sql >> Base de Datos >  >> RDS >> PostgreSQL

Agregar objeto dict a postgresql

Si su versión de PostgreSQL es suficientemente nueva (9.4+) y la versión de psycopg es>=2.5.4 todas las claves son cadenas y los valores se pueden representar como JSON, sería mejor almacenar esto en una columna JSONB. Luego, si surgiera la necesidad, la columna también se podría buscar. Simplemente cree la tabla simplemente como

CREATE TABLE thetable (
    uuid TEXT,
    dict JSONB
);

(... y, naturalmente, agregue índices, claves principales, etc., según sea necesario...) Al enviar el diccionario a PostgreSQL, solo necesita envolverlo con el Json adaptador; al recibir de PostgreSQL, el valor JSONB se convertiría automáticamente en un diccionario, por lo que la inserción se convertiría en

from psycopg2.extras import Json, DictCursor

cur = conn.cursor(cursor_factory=DictCursor)

cur.execute('INSERT into thetable (uuid, dict) values (%s, %s)',
    ['testName', Json({'id':'122','name':'test','number':'444-444-4444'})])

y seleccionar sería tan simple como

cur.execute('SELECT dict FROM thetable where uuid = %s', ['testName'])
row = cur.fetchone()
print(row['dict']) # its now a dictionary object with all the keys restored
print(row['dict']['number']) # the value of the number key

Con JSONB, PostgreSQL puede almacenar los valores de manera más eficiente que simplemente volcar el diccionario como texto. Además, es posible realizar consultas con los datos, por ejemplo, simplemente seleccione algunos de los campos de la columna JSONB:

>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']

o puede usarlos en consultas si es necesario:

>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
    ['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]