Jika versi PostgreSQL Anda cukup baru (9.4+) dan versi psycopg>=2.5.4 semua kunci adalah string dan nilai dapat direpresentasikan sebagai JSON, sebaiknya simpan ini ke dalam kolom JSONB. Kemudian, jika diperlukan, kolom akan dapat dicari juga. Cukup buat tabel sebagai
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... dan tentu saja menambahkan indeks, kunci utama, dll sesuai kebutuhan...) Saat mengirim kamus ke PostgreSQL, Anda hanya perlu membungkusnya dengan Json
adaptor; saat menerima dari PostgreSQL, nilai JSONB akan secara otomatis diubah menjadi kamus, sehingga penyisipan akan menjadi
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'})])
dan memilih akan sesederhana
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
Dengan JSONB, PostgreSQL dapat menyimpan nilai lebih efisien daripada hanya membuang kamus sebagai teks. Selain itu, dimungkinkan untuk melakukan kueri dengan data, misalnya cukup pilih beberapa bidang dari kolom JSONB:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
atau Anda dapat menggunakannya dalam kueri jika diperlukan:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]