sql >> Databasteknik >  >> RDS >> PostgreSQL

Lägger till dict-objekt till postgresql

Om din PostgreSQL-version är tillräckligt ny (9.4+) och psycopg-versionen är>=2.5.4 är alla nycklar strängar och värden kan representeras som JSON, skulle det vara bäst att lagra detta i en JSONB-kolumn. Om det skulle behövas skulle kolumnen också vara sökbar. Skapa bara tabellen som

CREATE TABLE thetable (
    uuid TEXT,
    dict JSONB
);

(... och naturligtvis lägg till index, primärnycklar etc vid behov...)När du skickar ordboken till PostgreSQL behöver du bara slå in den med Json adapter; när man tar emot från PostgreSQL skulle JSONB-värdet automatiskt omvandlas till en ordbok, vilket innebär att infogning blir

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

och att välja skulle vara så enkelt 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 lagra värdena mer effektivt än att bara dumpa ordboken som text. Dessutom blir det möjligt att göra frågor med data, till exempel välj bara några av fälten från JSONB-kolumnen:

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

eller så kan du använda dem i frågor om det behövs:

>>> 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. MariaDB Java Connector Driver Performance

  2. Introduktion till MaxScale Administration Använda maxctrl för MariaDB Cluster

  3. Rekursiva kategorier med en enda fråga?

  4. Hämta data från MySQL-databasen till html-rullgardinslistan