SQLAlchemy 更新多个 WHERE 条件
Posted
技术标签:
【中文标题】SQLAlchemy 更新多个 WHERE 条件【英文标题】:SQL Alchemy update multiple WHERE conditions 【发布时间】:2017-04-11 14:33:04 【问题描述】:我想从 pandas
数据框 (getdata1
) 列 rtrend
更新 mysql 表 (mydata1
) 中的列 rtrend
,确保值对应于适当的日期 (dt
)
例如rtrend
的 2016-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
要更新的字段,并将迭代提供给 .execute
。 getdata1
的输出可能直接可用。 (我希望您只是为了举例而重命名所有对象,并在实际代码中使用描述性名称。)
谢谢斯特凡诺。是的,只是为了示例而重命名了对象
【参考方案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 子句