首页 > 解决方案 > 使用 sqlalchemy 使用数据框列更新现有表的列

问题描述

我在后端有一个表(sql server)

table1
id   column1 column2
xxx   sada    NULL
yyy   dasa    NULL
zzz   awas    NULL

我有一个数据框--result_df 列- result_df.column2,并想更新表,但它不工作

session.query(table1).filter(table1.Id == result_df.id).update({table1.column2: result_df.column2})

但它不起作用,有没有更好的方法来做到这一点

我正在使用 sqlalchemy 和 python

标签: pythonsql-serverpython-3.xpandassqlalchemy

解决方案


这里有一个有用的文档:https ://docs.sqlalchemy.org/en/14/core/tutorial.html#inserts-updates-and-deletes

为了根据数据框更新每一行,我们需要使用带有指定每个值的字典列表的bindparam 。

我用 和 转换了数据框,to_dict('records')因为'id' 保留用于 VALUES 中的自动使用,我将id列转换为_id.

from sqlalchemy import bindparam

params = [{'_id' if k[0] == 'id' else k[0]: k[1]
           for k in d.items()} for d in df.to_dict('records')]

stmt = table1.update() \
    .where(table1.c.id == bindparam('_id')) \
    .values(column2=bindparam('column2'))
con.execute(stmt, params)

完整的工作示例:https ://ideone.com/3TQmZ7

文档中另一个更明确的示例:

stmt = (users_table.update().
        where(user_table.c.name == bindparam('username')).
        values(fullname=bindparam('fullname'))
        )

connection.execute(
    stmt, [{"username": "wendy", "fullname": "Wendy Smith"},
           {"username": "jack", "fullname": "Jack Jones"},
           ]
)

推荐阅读