一直在寻找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'上,这是唯一的,并且不会返回多行。
更新命令不适用于连接吗?或者上面的代码中有一个明显的错误我不知道?