Nếu phiên bản PostgreSQL của bạn đủ mới (9.4+) và phiên bản psycopg> =2.5.4, tất cả các khóa đều là chuỗi và các giá trị có thể được biểu diễn dưới dạng JSON, tốt nhất bạn nên lưu trữ nó vào một cột JSONB. Sau đó, nếu nhu cầu phát sinh, cột cũng sẽ có thể tìm kiếm được. Chỉ cần tạo bảng đơn giản như
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... và tự nhiên thêm chỉ mục, khóa chính, v.v. khi cần ...) Khi gửi từ điển đến PostgreSQL, bạn chỉ cần bọc nó bằng Json
bộ chuyển đổi; khi nhận từ PostgreSQL, giá trị JSONB sẽ được tự động chuyển đổi thành từ điển, do đó việc chèn sẽ trở thành
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'})])
và việc lựa chọn sẽ đơn giản như
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
Với JSONB, PostgreSQL có thể lưu trữ các giá trị hiệu quả hơn thay vì chỉ kết xuất từ điển dưới dạng văn bản. Ngoài ra, có thể thực hiện các truy vấn với dữ liệu, ví dụ:chỉ cần chọn một số trường từ cột JSONB:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
hoặc bạn có thể sử dụng chúng trong các truy vấn nếu cần:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]