यदि आपका PostgreSQL संस्करण पर्याप्त रूप से नया (9.4+) है और psycopg संस्करण> =2.5.4 है, तो सभी कुंजियाँ स्ट्रिंग हैं और मानों को JSON के रूप में दर्शाया जा सकता है, इसे JSONB कॉलम में संग्रहीत करना सबसे अच्छा होगा। फिर, जरूरत पड़ने पर कॉलम भी खोजा जा सकेगा। बस इस तरह से टेबल बनाएं
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(... और स्वाभाविक रूप से आवश्यकतानुसार अनुक्रमणिका, प्राथमिक कुंजी आदि जोड़ें...) PostgreSQL को शब्दकोश भेजते समय आपको बस इसे Json
के साथ लपेटना होगा अनुकूलक; PostgreSQL से प्राप्त होने पर JSONB मान स्वचालित रूप से एक शब्दकोश में परिवर्तित हो जाएगा, इस प्रकार सम्मिलित करना बन जाएगा
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'})])
और चयन करना उतना ही आसान होगा जितना कि
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
JSONB के साथ, PostgreSQL केवल डिक्शनरी को टेक्स्ट के रूप में डंप करने की तुलना में मूल्यों को अधिक कुशलता से संग्रहीत कर सकता है। इसके अतिरिक्त, डेटा के साथ क्वेरी करना संभव हो जाता है, उदाहरण के लिए JSONB कॉलम से कुछ फ़ील्ड चुनें:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
या यदि आवश्यक हो तो आप प्रश्नों में उनका उपयोग कर सकते हैं:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]