Python 从数据库中更新数据库中的现有行

Python 从数据库中更新数据库中的现有行,python,postgresql,pandas,Python,Postgresql,Pandas,我有一个PostgreSQL数据库。Pandas有一个“to_sql”函数,用于将数据帧的记录写入数据库。但我还没有找到任何关于在im使用完dataframe后如何使用pandas更新现有数据库行的文档 目前,我能够使用pandas read_sql_table将数据库表读入数据帧。然后根据需要处理数据。但是,我还没有弄清楚如何将该数据帧写入数据库以更新原始行 我不想覆盖整个表。我只需要更新最初选择的行。一种方法是使用sqlalchemy“表类”和session.merge(行)、session

我有一个PostgreSQL数据库。Pandas有一个“to_sql”函数,用于将数据帧的记录写入数据库。但我还没有找到任何关于在im使用完dataframe后如何使用pandas更新现有数据库行的文档

目前,我能够使用pandas read_sql_table将数据库表读入数据帧。然后根据需要处理数据。但是,我还没有弄清楚如何将该数据帧写入数据库以更新原始行


我不想覆盖整个表。我只需要更新最初选择的行。

一种方法是使用sqlalchemy“表类”和session.merge(行)、session.commit()

以下是一个例子:

for row in range(0, len(df)):
    row_data = table_class(column_1=df.ix[i]['column_name'],
                           column_2=df.ix[i]['column_name'],
                           ...
                           )
    session.merge(row_data)
    session.commit()

对于将表读取为df、更改df、然后基于df更新表值的sql炼金术案例,我发现df.to_sql与name=index=False一起工作,如果_exists='replace'


这将用您在df中更改的值替换表中的旧值

进一步研究后,我仍然没有找到解决方案。似乎您可以将pandas设置为\u sql(如果\u exists='append')。但是,似乎没有任何东西可以用于if_exists='update'。我觉得这很奇怪。建议使用什么方法将pandas数据帧恢复到数据库中并更新任何已更改的行?这当然是一项常见的任务?是否要向数据帧添加或删除新行?如果你不是,我想你知道你可以做查询。但是,即使您正在添加或删除行,在删除主键之后,也有一种简单的方法可以通过查询执行。如果您再多描述一下,我认为仅使用查询就有可能得到相对简单的答案。
to_sql
不支持更新。到目前为止,我发现最好的方法是在数据库表中创建一个插入时
触发器,如果插入重复的主键,它将更新所有字段。您的数据是否很大?钝器解决方案可以是:将数据库表中的数据再次读入某种类型的
原始表
数据帧,调用
原始表。更新(修改的表)
其中
修改的表
是您的数据帧,然后
读入sql(如果存在='replace')
使用这个新的dataframe对象。这应该在明年发布支持UPSERT的postgres 9.5时起作用!