PostgreSQLのバージョンが十分に新しく(9.4+)、psycopgバージョンが2.5.4以上であれば、すべてのキーは文字列であり、値はJSONとして表すことができます。これをJSONB列に保存することをお勧めします。次に、必要が生じた場合、列も検索可能になります。あなただけJson
アダプターでそれをラップする必要があるのPostgreSQLに辞書を送信する場合(... ...と、必要に応じて自然にインデックス、主キーなどを追加) を単に
CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
としてテーブルを作成します。 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'})])
と選択なる挿入するJSONBで
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
ように単純になり、辞書に変換される、PostgreSQLは、より効率的に値を格納することができます辞書をテキストとしてダンプするだけではありません。
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
または必要に応じて、あなたは、クエリでそれらを使用することもできます:また、それだけでJSONB列から一部のフィールドを選択し、たとえば、データにクエリを行うことが可能となる
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]
したがって、辞書オブジェクト全体を返す必要がある場合は、返す行['dict']を使用することができますか? – sbeyeler
@sbeyeler 'json.dumps'で動作する任意のデータ構造を使用できます。 –