Hvis din PostgreSQL-version er tilstrækkelig ny (9.4+) og psycopg-versionen er>=2.5.4, er alle nøglerne strenge, og værdier kan repræsenteres som JSON, ville det være bedst at gemme dette i en JSONB-kolonne. Så hvis der skulle være behov for det, ville kolonnen også være søgbar. Bare opret tabellen som
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... og tilføjer naturligvis indekser, primærnøgler osv. efter behov...)Når du sender ordbogen til PostgreSQL, skal du blot pakke den med Json
adapter; ved modtagelse fra PostgreSQL vil JSONB-værdien automatisk blive konverteret til en ordbog, således at indsættelse bliver
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'})])
og valg ville være så simpelt 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 gemme værdierne mere effektivt end blot at dumpe ordbogen som tekst. Derudover bliver det muligt at lave forespørgsler med dataene, for eksempel skal du blot vælge nogle af felterne fra JSONB-kolonnen:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
eller du kan bruge dem i forespørgsler, hvis det er nødvendigt:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]