sqlalchemy更新忽略过滤器的所有记录

时间:2014-09-10 21:31:17

标签: postgresql python-3.x sqlalchemy flask-sqlalchemy

一直在寻找bug并且使用sqlaclhemy定位以下意外行为(确切地说是flash-sqlalchemy)。

代码是

actionId = 1

DataLists.query.\
    join(Actions, actions.action_id == DataLists.action_id).\
    filter(Actions.action_id == actionId).\
    update({DataLists.dt_cancelled: datetime.utcnow()})

#Updates ALL DataLists!

查询(没有更新)返回1条记录,但所有记录都已更新。

#testing 
rows  = DataLists.query.\
    join(Actions, actions.action_id == DataLists.action_id).\
    filter(DataLists.action_id == actionId).\
    all()

print("rows: {}".format(len(rows))) # outputs 1

据我所知,更新适用于返回的行。这没有发生,所以我必须在这里遗漏一些东西。

我试图获取SQL语句的副本,但更新语句似乎不像普通查询那样工作,所以

sql = DataLists.query.\
    join(Actions, actions.action_id == DataLists.action_id).\
    filter(Actions.action_id == actionId).\
    update({DataLists.dt_cancelled: datetime.utcnow()})
print(str(sql))

不起作用,并返回114行已更新

现在事实证明,连接不是必需的,查询可以写成

DataLists.query.\ 
    filter(DataLists.action_id == actionId).\
    update({DataLists.dt_cancelled: datetime.utcnow()})

#testing
rows  = DataLists.query.\ 
    filter(DataLists.action_id == actionId).\
    all()

print("rows: {}".format(len(rows))) # outputs 1
奇怪的是(无论如何)这现在按预期工作。只需更新一行。

所以问题在于加入。但是每个DataList都连接在一个外键' action_id'上,这是唯一的,并且不会返回多行。

更新命令不适用于连接吗?或者上面的代码中有一个明显的错误我不知道?

0 个答案:

没有答案