Om din PostgreSQL-version är tillräckligt ny (9.4+) och psycopg-versionen är>=2.5.4 är alla nycklar strängar och värden kan representeras som JSON, skulle det vara bäst att lagra detta i en JSONB-kolumn. Om det skulle behövas skulle kolumnen också vara sökbar. Skapa bara tabellen som
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... och naturligtvis lägg till index, primärnycklar etc vid behov...)När du skickar ordboken till PostgreSQL behöver du bara slå in den med Json
adapter; när man tar emot från PostgreSQL skulle JSONB-värdet automatiskt omvandlas till en ordbok, vilket innebär att infogning blir
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'})])
och att välja skulle vara så enkelt som
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
Med JSONB kan PostgreSQL lagra värdena mer effektivt än att bara dumpa ordboken som text. Dessutom blir det möjligt att göra frågor med data, till exempel välj bara några av fälten från JSONB-kolumnen:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
eller så kan du använda dem i frågor om det behövs:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]