Pokud je vaše verze PostgreSQL dostatečně nová (9.4+) a verze psycopg je>=2.5.4, všechny klíče jsou řetězce a hodnoty mohou být reprezentovány jako JSON, bylo by nejlepší uložit to do sloupce JSONB. V případě potřeby by pak bylo možné prohledávat i sloupec. Jednoduše vytvořte tabulku jako
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(...a přirozeně přidejte indexy, primární klíče atd. podle potřeby...)Při odesílání slovníku do PostgreSQL jej stačí zabalit do Json
adaptér; při příjmu z PostgreSQL by se hodnota JSONB automaticky převedla do slovníku, takže vkládání by se stalo
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'})])
a výběr by byl stejně jednoduchý jako
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
S JSONB může PostgreSQL ukládat hodnoty efektivněji, než jen ukládat slovník jako text. Navíc je možné provádět dotazy s daty, například stačí vybrat některá pole ze sloupce JSONB:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
nebo je můžete v případě potřeby použít v dotazech:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]