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