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

Tilføjelse af dict-objekt til postgresql

Hvis din PostgreSQL-version er tilstrækkelig ny (9.4+) og psycopg-versionen er>=2.5.4, er alle nøglerne strenge, og værdier kan repræsenteres som JSON, ville det være bedst at gemme dette i en JSONB-kolonne. Så hvis der skulle være behov for det, ville kolonnen også være søgbar. Bare opret tabellen som

CREATE TABLE thetable (
    uuid TEXT,
    dict JSONB
);

(... og tilføjer naturligvis indekser, primærnøgler osv. efter behov...)Når du sender ordbogen til PostgreSQL, skal du blot pakke den med Json adapter; ved modtagelse fra PostgreSQL vil JSONB-værdien automatisk blive konverteret til en ordbog, således at indsættelse bliver

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

og valg ville være så simpelt som

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

Med JSONB kan PostgreSQL gemme værdierne mere effektivt end blot at dumpe ordbogen som tekst. Derudover bliver det muligt at lave forespørgsler med dataene, for eksempel skal du blot vælge nogle af felterne fra JSONB-kolonnen:

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

eller du kan bruge dem i forespørgsler, hvis det er nødvendigt:

>>> 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. Importer CSV-fil direkte til MySQL

  2. Hvordan indsætter man JSONB i Postgresql med Python?

  3. Android-rumdatabasen eksporterer ikke alle data

  4. Hvordan tilføjer jeg streng med automatisk stigningsværdi i SQL Server?