PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Adicionando objeto dict ao postgresql


Se sua versão do PostgreSQL for suficientemente nova (9.4+) e a versão do psycopg for>=2.5.4 todas as chaves são strings e os valores podem ser representados como JSON, seria melhor armazenar isso em uma coluna JSONB. Então, caso surja a necessidade, a coluna também poderá ser pesquisada. Basta criar a tabela simplesmente como
CREATE TABLE thetable (
    uuid TEXT,
    dict JSONB
);

(... e naturalmente adicionar índices, chaves primárias etc conforme necessário...) Ao enviar o dicionário para o PostgreSQL você só precisa envolvê-lo com o Json adaptador; ao receber do PostgreSQL o valor JSONB seria automaticamente convertido em um dicionário, então a inserção se tornaria
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 selecionar seria tão simples quanto
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

Com JSONB, o PostgreSQL pode armazenar os valores de forma mais eficiente do que apenas despejar o dicionário como texto. Adicionalmente, torna-se possível fazer consultas com os dados, por exemplo basta selecionar alguns dos campos da coluna JSONB:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']

ou você pode usá-los em consultas, se necessário:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
    ['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]