Se la tua versione di PostgreSQL è sufficientemente nuova (9.4+) e la versione di psycopg è>=2.5.4 tutte le chiavi sono stringhe e i valori possono essere rappresentati come JSON, sarebbe meglio archiviarlo in una colonna JSONB. Quindi, in caso di necessità, anche la colonna sarebbe ricercabile. Basta creare la tabella semplicemente come
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... e naturalmente aggiungi indici, chiavi primarie ecc. secondo necessità...) Quando invii il dizionario a PostgreSQL devi solo avvolgerlo con il Json
adattatore; alla ricezione da PostgreSQL il valore JSONB verrebbe automaticamente convertito in un dizionario, quindi l'inserimento diventerebbe
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'})])
e selezionare sarebbe semplice come
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 può memorizzare i valori in modo più efficiente rispetto al semplice dump del dizionario come testo. Inoltre, diventa possibile eseguire query con i dati, ad esempio basta selezionare alcuni dei campi dalla colonna JSONB:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
oppure potresti usarli nelle query se necessario:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]