Si votre version de PostgreSQL est suffisamment nouvelle (9.4+) et que la version de psycopg est>=2.5.4, toutes les clés sont des chaînes et les valeurs peuvent être représentées sous forme de JSON, il serait préférable de stocker cela dans une colonne JSONB. Ensuite, si le besoin s'en faisait sentir, la colonne serait également consultable. Créez simplement le tableau simplement comme
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... et ajouter naturellement des index, des clés primaires, etc. au besoin...) Lors de l'envoi du dictionnaire à PostgreSQL, il vous suffit de l'envelopper avec le Json
adaptateur; lors de la réception de PostgreSQL, la valeur JSONB serait automatiquement convertie en dictionnaire, ainsi l'insertion deviendrait
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'})])
et la sélection serait aussi simple que
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
Avec JSONB, PostgreSQL peut stocker les valeurs plus efficacement que de simplement vider le dictionnaire sous forme de texte. De plus, il devient possible de faire des requêtes avec les données, par exemple il suffit de sélectionner certains des champs de la colonne JSONB :
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
ou vous pouvez les utiliser dans des requêtes si nécessaire :
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]