使用SQLAalchemy构造UPDATE .. SET .. WHERE ..语句

时间:2018-01-04 14:01:44

标签: python sqlalchemy

我有两个列名列表:setcolswherecols。我想用SQLAlchemy方法构建一个查询,该方法与

一致
UPDATE tablename SET setcols[0]= ?, ... WHERE wherecols[0]= ?, ...

我尝试的是

t = sa.table('tablename', *[sa.column(name) for name in setcols+wherecols])

query = t.update(). \
        where(t.c[cn] == sa.bindparam(cn) for cn in wherecols).\
        values({cn: sa.bindparam(cn) for cn in setcols})

和这个

query = t.update({cn: sa.bindparam(cn) for cn in setcols}). \
        where(t.c[cn] == sa.bindparam(cn) for cn in wherecols)

但这些都没有奏效,我收到了以下错误:

sqlalchemy.exc.ArgumentError: SQL expression object or string expected, got object of type <class 'generator'> instead

我已经阅读了手册,并认为要设置的值可以作为字典提供,但我发现我错了......

有人可以帮忙吗?

我使用sqlalchemy-1.1.13。

1 个答案:

答案 0 :(得分:2)

问题在于您拨打where()的方式。它期望whereclause,而不是生成器对象。使用例如and_or_

组合生成的谓词
query = t.update(). \
        where(and_(*[t.c[cn] == sa.bindparam(cn) for cn in wherecols])).\
        values({cn: sa.bindparam(cn) for cn in setcols})