PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Ajout d'un objet dict à postgresql

Si votre version de PostgreSQL est suffisamment nouvelle (9.4+) et que la version de psycopg est>=2.5.4, toutes les clés sont des chaînes et les valeurs peuvent être représentées sous forme de JSON, il serait préférable de stocker cela dans une colonne JSONB. Ensuite, si le besoin s'en faisait sentir, la colonne serait également consultable. Créez simplement le tableau simplement comme

CREATE TABLE thetable (
    uuid TEXT,
    dict JSONB
);

(... et ajouter naturellement des index, des clés primaires, etc. au besoin...) Lors de l'envoi du dictionnaire à PostgreSQL, il vous suffit de l'envelopper avec le Json adaptateur; lors de la réception de PostgreSQL, la valeur JSONB serait automatiquement convertie en dictionnaire, ainsi l'insertion deviendrait

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'})])

et la sélection serait aussi simple que

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

Avec JSONB, PostgreSQL peut stocker les valeurs plus efficacement que de simplement vider le dictionnaire sous forme de texte. De plus, il devient possible de faire des requêtes avec les données, par exemple il suffit de sélectionner certains des champs de la colonne JSONB :

>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']

ou vous pouvez les utiliser dans des requêtes si nécessaire :

>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
    ['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]