Jeśli twoja wersja PostgreSQL jest wystarczająco nowa (9.4+), a wersja psycopg jest>=2.5.4, wszystkie klucze są ciągami i wartościami mogą być reprezentowane jako JSON, najlepiej byłoby zapisać to w kolumnie JSONB. Wtedy, jeśli zajdzie taka potrzeba, kolumnę będzie można przeszukiwać. Po prostu utwórz tabelę jako
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... i oczywiście dodaj indeksy, klucze podstawowe itp. w razie potrzeby...) Podczas wysyłania słownika do PostgreSQL wystarczy owinąć go za pomocą Json
adapter; podczas odbierania z PostgreSQL wartość JSONB byłaby automatycznie konwertowana do słownika, dzięki czemu wstawianie stałoby się
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 wybór byłby tak prosty jak
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
Dzięki JSONB PostgreSQL może przechowywać wartości wydajniej niż tylko zrzucanie słownika jako tekstu. Dodatkowo staje się możliwe wykonywanie zapytań z danymi, na przykład wystarczy wybrać niektóre pola z kolumny JSONB:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
lub w razie potrzeby możesz ich użyć w zapytaniach:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]