如何将字典项插入 PostgreSQL table
How to insert dictionary items into a PostgreSQL table
因此,我已使用 Psycopg2 将我的 Postgresql 数据库连接到 Python,并且提取了两个特定的列进行更新。第一列我用作 Python 字典中的键,我在第二列上有 运行 一些函数并将结果用作字典中的值。现在我想要做的是将这些值作为新列添加回 Postgresql table,但我希望它们与它们在字典中配对的正确键配对。本质上,我想获取字典值并将它们作为新列插入,然后在 Postgresql table 中选择它们所属的 "key" (但是,我不想手动分配它们,因为,好吧,希望有更好的方法)。
PostgreSQL Table
|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),
... : ...
}
现在我的目标是将值列添加回我的 table,以便它与原始键相对应。理想情况下,看起来像这样:
|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
我知道我可以将列插入 table,但不确定如何将它与键配对。非常感谢任何帮助!
您需要一个类似于以下内容的 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()
更新单个查询中的所有行。先把字典转成元组列表:
l = [(k,v) for k,v in my_dict.items()]
A 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
并在赋值或比较时转换为适当的类型。对于所有其他类型,只需像往常一样声明它们。
因此,我已使用 Psycopg2 将我的 Postgresql 数据库连接到 Python,并且提取了两个特定的列进行更新。第一列我用作 Python 字典中的键,我在第二列上有 运行 一些函数并将结果用作字典中的值。现在我想要做的是将这些值作为新列添加回 Postgresql table,但我希望它们与它们在字典中配对的正确键配对。本质上,我想获取字典值并将它们作为新列插入,然后在 Postgresql table 中选择它们所属的 "key" (但是,我不想手动分配它们,因为,好吧,希望有更好的方法)。
PostgreSQL Table
|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),
... : ...
}
现在我的目标是将值列添加回我的 table,以便它与原始键相对应。理想情况下,看起来像这样:
|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
我知道我可以将列插入 table,但不确定如何将它与键配对。非常感谢任何帮助!
您需要一个类似于以下内容的 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()
更新单个查询中的所有行。先把字典转成元组列表:
l = [(k,v) for k,v in my_dict.items()]
A 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
并在赋值或比较时转换为适当的类型。对于所有其他类型,只需像往常一样声明它们。