Añadiendo el objeto dict a postgresql

Así que estoy usando psycopg2 en Python3.5 para insertar algunos datos en una base de datos postgresql. Lo que me gustaría hacer es tener dos columnas que sean cadenas y que la última columna sea un objeto dict. No necesito buscar el dictado, solo ser capaz de sacarlo de la base de datos y usarlo.

así, por ejemplo:

uuid = "testName" otherString = "" dict = {'id':'122','name':'test','number':'444-444-4444'} # add code here to store two strings and dict to postgresql cur.execute('''SELECT dict FROM table where uuid = %s''', 'testName') newDict = cur.fetchone() print(newDict['number']) 

¿Es esto posible? Y si es así, ¿cómo podría hacerlo?

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. Entonces, si surgiera la necesidad, la columna también se podría buscar. Solo crea la tabla simplemente como

 CREATE TABLE thetable ( uuid TEXT, dict JSONB ); 

(… y naturalmente agregue índices, claves primarias, etc. según sea necesario …) Al enviar el diccionario a PostgreSQL, solo necesita envolverlo con el adaptador Json ; 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 la selección 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 restred 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 hacer 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'}]] 

Puede serializar los datos utilizando JSON antes de almacenar los datos:

 import json data = json.dumps({'id':'122','name':'test','number':'444-444-4444'}) 

Luego, al recuperar el código lo deserializa:

 cur.execute('SELECT dict from ....') res = cur.fetchone() dict = json.loads(res['dict']) print(dict['number'])