Als uw PostgreSQL-versie voldoende nieuw is (9.4+) en de psycopg-versie>=2.5.4, zijn alle sleutels strings en kunnen waarden worden weergegeven als JSON, dan kunt u dit het beste in een JSONB-kolom opslaan. Als dat nodig mocht zijn, zou de kolom ook doorzoekbaar zijn. Maak de tabel gewoon aan als
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... en indien nodig natuurlijk indexen, primaire sleutels enz. toevoegen...) Wanneer u het woordenboek naar PostgreSQL verzendt, hoeft u het alleen maar in te pakken met de Json
adapter; bij ontvangst van PostgreSQL zou de JSONB-waarde automatisch worden omgezet in een woordenboek, dus invoegen zou worden
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'})])
en selecteren zou zo eenvoudig zijn als
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
Met JSONB kan PostgreSQL de waarden efficiënter opslaan dan alleen het woordenboek als tekst te dumpen. Bovendien wordt het mogelijk om query's uit te voeren met de gegevens, bijvoorbeeld door enkele velden uit de JSONB-kolom te selecteren:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
of u kunt ze indien nodig in query's gebruiken:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]