SQL Alchemy更新多个WHERE条件

时间:2017-04-11 14:33:05

标签: python mysql pandas sqlalchemy sql-update

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

e.g。来自rtrend df的2016-08-09的{​​{1}}值会更新相应的MySQL getdata1 mydata1 2016-08-09值。

另外指定特定的安全ID,例如在这种情况下rtrend

security_id == 'GS'

这会产生updateexample = update(mydata1) .where(mydata1.c.security_id=='GS', mydata1.c.dt==getdata1['dt']) .values(rtrend=getdata1['rtrend']) 请有人帮忙以正确的方式解决这个问题吗?

当前表和数据框的示例:

pandas dataframe'getdata1'

AttributeError: 'Series' object has no attribute 'translate'

MySQL表'mydata1'

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

1 个答案:

答案 0 :(得分: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()只是为了将数据类型与我的表匹配。