如何将字典项插入PostgreSQL表

时间:2016-08-11 03:57:55

标签: python postgresql dictionary key-value psycopg2

所以我用Psycopg2将我的Postgresql数据库连接到Python,我已经提取了两个特定的列进行更新。我用作Python字典中的键的第一列,我在第二列上运行了一些函数,并将结果用作字典中的值。现在我想要做的是将这些值作为新列添加回Postgresql表中,但我希望它们与字典中与它们配对的正确键配对。本质上,我想获取字典值并将它们作为新列插入并选择它们所属的Postgresql表中的“键”(但是,我不想手动分配它们,因为,好吧,希望有更好的方法)。

Postgresql表

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

这是我在Python中创建的字典,其中f()是一系列在变量上运行的函数:

{ 
    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

我知道我可以将列插入表中,但不知道如何将其与键配对。非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

更新单个查询中的所有行。首先将字典转换为元组列表:

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

元组的Python列表适用于Psycopg的记录数组。然后在unnest子句中from数组:

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并在赋值或比较时转换为适当的类型。对于所有其他类型,只需像往常一样声明它们。