2017-07-17 20 views
0

私は、psycopg2をPython3.5で使用して、いくつかのデータをpostgresqlデータベースに挿入しています。私がしたいことは、文字列であり、最後の列をdictオブジェクトにするという2つの列を持つことです。私は辞書を検索する必要はなく、データベースから取り出して使用することができます。そのインスタンスのpostgresqlにdictオブジェクトを追加する

uuid = "testName" 
otherString = "" 
dict = {'id':'122','name':'test','number':'444-444-4444'} 

# add code here to store two strings and dict to postgresql 

cur.execute('''SELECT dict FROM table where uuid = %s''', 'testName') 
newDict = cur.fetchone() 
print(newDict['number']) 

が、このことは可能ですし、もしそうならどのように私はこれをやって行くのでしょうか?

答えて

3

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

したがって、辞書オブジェクト全体を返す必要がある場合は、返す行['dict']を使用することができますか? – sbeyeler

+0

@sbeyeler 'json.dumps'で動作する任意のデータ構造を使用できます。 –

1

あなたは、データを格納する前にJSONを使用してデータをシリアライズすることができます

import json 

data = json.dumps({'id':'122','name':'test','number':'444-444-4444'}) 

次に、あなたがそれをデシリアライズコード取り出すとき:

cur.execute('SELECT dict from ....') 
res = cur.fetchone() 

dict = json.loads(res['dict']) 
print(dict['number']) 
関連する問題