PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiunta dell'oggetto dict a postgresql

Se la tua versione di PostgreSQL è sufficientemente nuova (9.4+) e la versione di psycopg è>=2.5.4 tutte le chiavi sono stringhe e i valori possono essere rappresentati come JSON, sarebbe meglio archiviarlo in una colonna JSONB. Quindi, in caso di necessità, anche la colonna sarebbe ricercabile. Basta creare la tabella semplicemente come

CREATE TABLE thetable (
    uuid TEXT,
    dict JSONB
);

(... e naturalmente aggiungi indici, chiavi primarie ecc. secondo necessità...) Quando invii il dizionario a PostgreSQL devi solo avvolgerlo con il Json adattatore; alla ricezione da PostgreSQL il valore JSONB verrebbe automaticamente convertito in un dizionario, quindi l'inserimento diventerebbe

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

e selezionare sarebbe semplice come

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

Con JSONB, PostgreSQL può memorizzare i valori in modo più efficiente rispetto al semplice dump del dizionario come testo. Inoltre, diventa possibile eseguire query con i dati, ad esempio basta selezionare alcuni dei campi dalla colonna JSONB:

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

oppure potresti usarli nelle query se necessario:

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