SQLAlchemy 更新多个 WHERE 条件

Posted

技术标签:

【中文标题】SQLAlchemy 更新多个 WHERE 条件【英文标题】:SQL Alchemy update multiple WHERE conditions 【发布时间】:2017-04-11 14:33:04 【问题描述】:

我想从 pandas 数据框 (getdata1) 列 rtrend 更新 mysql 表 (mydata1) 中的列 rtrend,确保值对应于适当的日期 (dt)

例如rtrend2016-08-09 的值来自 getdata1 df 更新相应的 MySQL mydata1 2016-08-09 rtrend 值。

另外指定一个特定的安全 id,例如security_id == 'GS' 在这种情况下

updateexample = update(mydata1)
      .where(mydata1.c.security_id=='GS', mydata1.c.dt==getdata1['dt'])
      .values(rtrend=getdata1['rtrend'])

这会产生AttributeError: 'Series' object has no attribute 'translate' 请有人帮助解决这个问题的正确方法吗?

当前表和数据框示例:

熊猫数据框'getdata1'

dt         | security_id | rtrend
2016-08-09 | GS          | 1
2016-08-10 | GS          | -1

MySQL 表 'mydata1'

dt         | security_id | rtrend
2016-08-09 | GS          | NULL
2016-08-10 | GS          | NULL

【问题讨论】:

阅读批量更新; an example。这个想法是 bindparam 要更新的字段,并将迭代提供给 .executegetdata1 的输出可能直接可用。 (我希望您只是为了举例而重命名所有对象,并在实际代码中使用描述性名称。) 谢谢斯特凡诺。是的,只是为了示例而重命名了对象 【参考方案1】:

这是我使用上述指导的解决方案

http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.bindparam

updatecode1 = update(mydata1).
    where(and_(mydata1.c.dt == bindparam('1dt'), mydata1.c.security_id == bindparam('1security_id')) ).
    values('rtrend' : bindparam('1rtrend'),'ma200' : bindparam('1ma200'))

然后循环定义每个值并更新表

b1 = 'GS'

i = 0

for i in range(len(getdata1)):
    a1 = getdata1.iloc[i]['dt']
    c1 = int(getdata1.iloc[i]['rtrend'])
    d1 = float(getdata1.iloc[i]['MA200'])

    conn.execute(updatecode1, '1dt' : a1, '1security_id' : b1, '1rtrend' : c1, '1ma200' : d1)

我确信可能有一种比以这种方式循环更有效的方法,但这对我的问题很有用。

注意:在上面的“c1”和“d1”中,我使用 int() 和 float() 只是为了将数据类型与我的表匹配。

【讨论】:

以上是关于SQLAlchemy 更新多个 WHERE 条件的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 WHERE 和 SELECT 条件的更新 - MySql

使用 sqlalchemy 查询使用多列 where in 子句

我想学习数据库增删改查

我可以做 Model->where('id', ARRAY) 多个 where 条件吗?

查询多个连接sqlalchemy

SQL语句中where条件的写法