2017-08-04 7 views
1

Ich habe eine PostgreSQL-Datenbanktabelle mit einer JSON-Datentypspalte. Wenn ich JSON-Zeichenfolgen in der Datenbank speichere, wird None nicht beibehalten. Dies kann mit diesem Code-Schnipsel wiedergegeben werden:Python beibehalten Keine/NULL beim Speichern von JSON in Postgres

import json,psycopg2 

dictionary = {} 
dictionary[None] = 0 

conn = psycopg2.connect("host='localhost' dbname='testdb' user='postgres' 
password='postgres'") 
cursor = conn.cursor() 

cursor.execute("""INSERT INTO testtable (json_column) VALUES (%s)""", 
(json.dumps(dictionary),)) 
cursor.execute("""SELECT json_column FROM testtable""") 
result = cursor.fetchall()[0][0].keys()[0] 

print result 
print type(result) 
if result is None: 
    print 'result is None' 
else: 
    print 'result is not None' 

Der Ausgang dieses Python-Code ist:

[email protected]:~/python$ python test.py 
null 
<type 'unicode'> 
result is not None 
[email protected]:~/python$ 

Wie kann ich speichern None als Schlüssel in der JSON-Spalte? Das JSON-Objekt verfügt auch über Schlüssel für 'None' und 'null', daher muss der gespeicherte Wert None oder null lauten.

+0

Sie tun es falsch. Sie sollten einen [JSON * Spaltentyp * in PostgreSQL] verwenden (https://stackoverflow.com/questions/45150617/adding-dict-object-to-postgresql) ... –

+0

Sie können nicht 'None' (oder 'null', das JSON-Äquivalent) ist ein Schlüssel in einem JSON-Objekt. Ihr Diktat ist einfach nicht mit dem JSON-Format kompatibel. – user2357112

Antwort

2

Von RFC 7159:

eine Objektstruktur als ein Paar von geschweiften Klammern dargestellt ist umgebenden null oder mehr Namen/Wert-Paare (oder Elemente). Ein Name ist eine Zeichenfolge.

Und von der Python docs:

Schlüssel in Schlüssel/Wert-Paare von JSON sind immer vom Typ str. Wenn ein Wörterbuch in JSON konvertiert wird, werden alle Schlüssel des Wörterbuchs in Zeichenketten umgewandelt.

JSON hat kein Konzept von Nicht-String dict Schlüssel. Wenn Sie diese möchten, wollen Sie JSON nicht. Der nächste, den Sie mit JSON bekommen, ist die Erkennung der Zeichenfolge None wird in konvertiert und in der Hoffnung, dass Sie nie wirklich die Zeichenfolge 'null' als Diktatschlüssel verwenden müssen.

+0

Gibt es einen anderen wörterbuchähnlichen Datentyp, der Nicht-String-Schlüssel verarbeiten kann? – Drew

+0

@Drew: Vielleicht interessiert dich [YAML] (https://en.wikipedia.org/wiki/YAML). – user2357112

Verwandte Themen