Sqlalchemy - 使用过滤器更新行会生成列表索引错误

时间:2015-04-22 22:37:38

标签: python sqlite sqlalchemy

我希望这是我关于这个宠物项目的最后一个问题。

我试图用当前时间更新表Clocktimes(column = time_out)。我想通过UUID4创建的UUID进行选择。当我运行代码时,我在query.py(Sqlalchemy的一部分)中的函数上得到ListIndex超出范围错误。我在我的代码下面列出了相当短的功能。

我的代码:

out = session.query(). \
        filter(Clocktime.p_uuid == p_uuid). \
        update(Clocktime.time_out == datetime.datetime.now())
    session.add(out)
    session.commit()

Sqlalchemy代码抛出错误:

def _entity_zero(self):
    return self._entities[0]

Sqlalchemy代码相当复杂,所以我还没看过它,但我的理论是,由于某些原因它不喜欢我的过滤器。无论如何,我无法弄清楚 - 你们有什么想法吗?

1 个答案:

答案 0 :(得分:7)

我不认为您的代码正在执行您希望它执行的操作。 有两种方法可以进行所需的更新:

1)直接在数据库上:

upd = (session.query(Clocktime)
       .filter(Clocktime.p_uuid == p_uuid)
       .update({"time_out": datetime.datetime.now()})
       )
print("# of updated rows = {}".format(upd))
# session.commit()

2)加载对象,更新值,并提交会话

upd = (session.query(Clocktime)
       .filter(Clocktime.p_uuid == p_uuid)
       )

# assuming there should be exactly one object for given p_uuid    
clockTime = upd.one()
clockTime.time_out = datetime.datetime.now()
session.commit()