Ако вашата версия на PostgreSQL е достатъчно нова (9.4+) и версията на psycopg е>=2.5.4 всички ключове са низове и стойностите могат да бъдат представени като JSON, би било най-добре да го съхраните в колона JSONB. След това, ако възникне необходимост, колоната също ще може да бъде търсена. Просто създайте таблицата просто като
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... и естествено добавяйте индекси, първични ключове и т.н., ако е необходимо...) Когато изпращате речника до PostgreSQL, просто трябва да го обвиете с Json
адаптер; при получаване от PostgreSQL стойността на JSONB ще бъде автоматично преобразувана в речник, като по този начин вмъкването ще стане
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'})])
и изборът ще бъде толкова лесен, колкото
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
С JSONB PostgreSQL може да съхранява стойностите по-ефективно, отколкото просто да изхвърля речника като текст. Освен това става възможно да правите заявки с данните, например просто изберете някои от полетата от колоната JSONB:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
или можете да ги използвате в заявки, ако е необходимо:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]