【问题标题】:Update column of an existing table with a dataframe column using sqlalchemy使用 sqlalchemy 使用数据框列更新现有表的列
【发布时间】:2021-05-14 06:48:45
【问题描述】:

我在后端(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

【问题讨论】:

    标签: python sql-server python-3.x pandas sqlalchemy


    【解决方案1】:

    这里有一个有用的文档: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"},
               ]
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多