2017-07-17 5 views
0

Also verwende ich psycopg2 auf Python3.5, um einige Daten in eine postgresql Datenbank einzufügen. Was ich tun möchte, ist zwei Spalten, die Strings sind und die letzte Spalte nur ein dict-Objekt sein. Ich muss das Diktat nicht suchen, sondern es einfach aus der Datenbank herausholen und verwenden.dict object zu postgresql hinzufügen

so zum Beispiel:

uuid = "testName" 
otherString = "" 
dict = {'id':'122','name':'test','number':'444-444-4444'} 

# add code here to store two strings and dict to postgresql 

cur.execute('''SELECT dict FROM table where uuid = %s''', 'testName') 
newDict = cur.fetchone() 
print(newDict['number']) 

Ist dies möglich, und wenn ja, wie würde ich mich über dieses tun?

Antwort

3

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'}]] 
+0

Also, wenn ich das gesamte Wörterbuch-Objekt zurückgeben müsste, könnte ich dies mit der Return-Zeile ['dict'] tun? – sbeyeler

+0

@sbeyeler jede Datenstruktur, die mit 'json.dumps' arbeitet, kann verwendet werden. –

1

Sie können die Daten serialisieren JSON verwenden, bevor die Daten zu speichern:

import json 

data = json.dumps({'id':'122','name':'test','number':'444-444-4444'}) 

Dann, wenn Sie den Code Abrufen Sie deserialisieren es:

cur.execute('SELECT dict from ....') 
res = cur.fetchone() 

dict = json.loads(res['dict']) 
print(dict['number'])