2016-08-11 7 views
3

私は自分のPostgreSQLデータベースをPythonにPsycopg2で接続しました。私は更新するために2つの特定の列を取りました。最初の列はPython辞書のキーとして使用しました。私は2番目の列でいくつかの関数を実行し、その結果を辞書の値として使用しました。今私がしたいのは、これらの値をPostgresqlのテーブルに新しいカラムとして追加することですが、それらを辞書でペアになっている正しいキーとペアにしたいと思います。基本的に、私は辞書の値を取って、それらを新しい列として挿入し、それらが属しているPostgresql表の中のどの「キー」を選びたいと思っています(ただし、手動で割り当てることは望ましくありません。 )。辞書項目をPostgreSQLテーブルに挿入する方法

PostgreSQLの表

 |col1 |col2 |col3 | ... | coln 
row1 | a1 | b1 | c1 | ... | n1 
row2 | a2 | b2 | c2 | ... | n2 
... | ... | ... | ... | ... | n... 
rowm | am | bm | cm | ... | nm 

これは私が変数に走ったf()は、一連の機能ではPythonで作成された辞書です:

{ 
    a1 : f(c1), 
    a2 : f(c2), 
    ... : ... 
} 

今、私の目標は、バック値の列を追加することです私のテーブルにそれが元のキーに対応するように。理想的には、次のようなものを見てください:

 |col1|col2|col3| ... |newcol| coln 
row1 | a1 | b1 | c1 | ... | f(c1)| n1 
row2 | a2 | b2 | c2 | ... | f(c2)| n2 
... | ...| ...| ...| ... | ... | n... 
rowm | am | bm | cm | ... | f(cm)| nm 

私はテーブルに列を挿入することはできますが、キーとペアリングする方法はわかりません。どんな助けでも大歓迎です!

+0

'col1'はdbテーブルの主キーですか? (それはpython dictのキーです) – joop

+0

@joopでは、カラム1にはそれぞれの値のペアが実際に存在するため、col1はデータベースのプライマリキーではありません。レコード番号はカラム番号と基本的には関連していますが、各行を一意に識別することができます(プライマリキーだと思います)。 – dtluther

答えて

0

次のようなUPDATE文は何かしたい:

import psycopg2 

con = psycopg2.connect('your connection string') 
cur = connection.cursor() 
# add newcol 
cur.execute('ALTER TABLE your_table ADD COLUMN newcol text;') 
con.commit() 
for k,v in your_dict.iteritems(): 
    cursor.execute('''UPDATE your_table 
         SET newcol = (%s) 
         WHERE col1 = (%s);''',(v,k)) 
    conn.commit() 
cur.close() 
con.close() 
0

は、単一のクエリ内のすべての行を更新します。最初のタプルのリストに辞書を回す:タプルの

l = [(k,v) for k,v in my_dict.items()] 

A PythonのリストはPsycopgによってレコードの配列に適合されます。そして、from句のunnest配列:

query = ''' 
    update t 
    set colX = s.val::text 
    from unnest(%s) s (key integer, val unknown) 
    where t.col1 = s.key 
''' 

print cursor.mogrify(query, (l,)) 
cursor.execute(query, (l,)) 

レコードは、その要素の型が宣言されている必要がありunnestから返されました。文字列値の場合、その型をunknownと宣言し、代入または比較時に適切な型にキャストする必要があります。他のすべての型については、通常通り宣言するだけです。

関連する問題