sql >> Database >  >> RDS >> PostgreSQL

Dict-object toevoegen aan postgresql

Als uw PostgreSQL-versie voldoende nieuw is (9.4+) en de psycopg-versie>=2.5.4, zijn alle sleutels strings en kunnen waarden worden weergegeven als JSON, dan kunt u dit het beste in een JSONB-kolom opslaan. Als dat nodig mocht zijn, zou de kolom ook doorzoekbaar zijn. Maak de tabel gewoon aan als

CREATE TABLE thetable (
    uuid TEXT,
    dict JSONB
);

(... en indien nodig natuurlijk indexen, primaire sleutels enz. toevoegen...) Wanneer u het woordenboek naar PostgreSQL verzendt, hoeft u het alleen maar in te pakken met de Json adapter; bij ontvangst van PostgreSQL zou de JSONB-waarde automatisch worden omgezet in een woordenboek, dus invoegen zou worden

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

en selecteren zou zo eenvoudig zijn als

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

Met JSONB kan PostgreSQL de waarden efficiënter opslaan dan alleen het woordenboek als tekst te dumpen. Bovendien wordt het mogelijk om query's uit te voeren met de gegevens, bijvoorbeeld door enkele velden uit de JSONB-kolom te selecteren:

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

of u kunt ze indien nodig in query's gebruiken:

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


  1. Verbinding maken met MySQL met Microsoft .NET

  2. Aanroepnotatie voor PL/SQL-subroutines in Oracle Database

  3. Hoe te updaten met inner join in Oracle

  4. Is het mogelijk om een ​​variabele te gebruiken en geen retourtype op te geven in postgreSQL?