Wenn Ihre PostgreSQL-Version ausreichend neu ist (9.4+) und die psycopg-Version>=2.5.4 ist, sind alle Schlüssel Zeichenfolgen und Werte können als JSON dargestellt werden, es wäre am besten, dies in einer JSONB-Spalte zu speichern. Dann wäre die Spalte bei Bedarf auch durchsuchbar. Erstellen Sie die Tabelle einfach als
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... und natürlich Indizes, Primärschlüssel usw. nach Bedarf hinzufügen...) Wenn Sie das Wörterbuch an PostgreSQL senden, müssen Sie es nur mit dem Json
umschließen Adapter; Beim Empfang von PostgreSQL würde der JSONB-Wert automatisch in ein Wörterbuch konvertiert, sodass das Einfügen zu
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'})])
und die Auswahl wäre so einfach wie
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
Mit JSONB kann PostgreSQL die Werte effizienter speichern, als nur das Wörterbuch als Text auszugeben. Zusätzlich wird es möglich, Abfragen mit den Daten durchzuführen, zum Beispiel wählen Sie einfach einige der Felder aus der JSONB-Spalte aus:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
oder Sie könnten sie bei Bedarf in Abfragen verwenden:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]