PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Diktobjekt zu postgresql hinzufügen

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

würde
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'}]]