Wenn Ihre PostgreSQL-Version ausreichend neu ist (9.4+) und die psycopg-Version> = 2.5.4 alle Schlüssel sind Zeichenfolgen und Werte können als JSON dargestellt werden, wäre es am besten, dies in einer JSONB-Spalte zu speichern. Dann, falls es notwendig sein sollte, wäre die Spalte auch durchsuchbar. Erstellen Sie einfach die Tabelle einfach als
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... und natürlich hinzufügen, Indizes, Primärschlüssel usw. je nach Bedarf ...) Wenn das Wörterbuch zu PostgreSQL Senden Sie brauchen nur mit dem Json
Adapter zu wickeln; wenn von PostgreSQL der JSONB Wert empfangen würde automatisch in ein Wörterbuch umgewandelt werden, so dass
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 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 würde eingefügt haben, kann PostgreSQL die Werte speichern effiziente als nur das Wörterbuch als Text zu entleeren. Darüber hinaus wird es möglich, Abfragen mit den Daten zu tun, zum Beispiel nur die einige der Felder aus der JSONB Spalte auswählen:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
oder man konnte sich in Abfragen verwenden, wenn nötig:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]
Also, wenn ich das gesamte Wörterbuch-Objekt zurückgeben müsste, könnte ich dies mit der Return-Zeile ['dict'] tun? – sbeyeler
@sbeyeler jede Datenstruktur, die mit 'json.dumps' arbeitet, kann verwendet werden. –