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'}]]