gpt4 book ai didi

python - Neo4j 驱动程序 - 确认交易成功

转载 作者:行者123 更新时间:2023-12-02 00:54:01 24 4
gpt4 key购买 nike

我刚刚开始使用用于 python 的新 neo4j 驱动程序,但完全被事务卡住了。如何检查交易是否成功完成?据我所知,commit 函数不会自动引发任何错误,例如,如果我向它提供不正确的 Cypher 查询,我将得不到任何相关信息。

我尝试从 Session 对象中读取 last_result 参数,并得出如下结果:

import neo4j.v1 as neo

def db_confirm_transaction_success(session):
try:
w = list(session.last_result)
return True
except neo.CypherError as e:
session.last_result._consumed = True
return False
except neo.ResultError as e:
session.last_result._consumed = True
return False

它有点工作......然而,它确实需要修改私有(private)属性并且看起来不正确/正确。必须有一个更简单、更优雅的解决方案。

预先感谢您的帮助。

编辑:为了清楚起见,Transaction.success 属性指示事务是否应提交或回滚。然而,例如Cypher 错误可以在查询执行时被识别出来。

最佳答案

在给出 developer manual 之前,我一直在努力解决同样的问题一读。

直到那时,我才明白为什么用 session.run(statement) 运行几个错误的语句不会引发异常,而是 session.close() 会。

然后我尝试使用类似的东西:

with session.begin_transaction() as tx:
tx.run(statement)
tx.success = True

如果你不需要上下文管理器,你可以使用:

tx = session.begin_transaction()
tx.run(statement)
tx.commit()

如果您阅读 python docs您可能会注意到 tx.commit() 与运行 tx.success=Truetx.close() 是一样的。

问题在于,调用 commit() 只会将 COMMIT 密码消息附加到连接的流中。据我所知,它不会验证交易是否成功。


阅读手册第 18 节后,我发现因为我没有明确使用结果,所以无法保证语句已被处理,因为库使用延迟加载(仅按需检索结果)。请参阅下面 18.1 的注释:

“当光标在流中移动时,结果记录被延迟加载。这表示必须先将光标移动到第一个结果,然后才能显示该结果消费。这也意味着整个流必须在之前显式消费摘要信息和元数据可用。通常最好的做法是显式使用结果并关闭 session ,特别是在运行更新时声明。即使不需要摘要信息,这也适用。未能使用结果可能会导致不可预测的行为,因为无法保证服务器已经看到并处理了 Cypher 语句。”


因此,从本质上讲,您需要在运行 cypher 语句后显式使用结果。这可以像这样完成:

res = session.run(statement) # or the equivalent iusing transaction style
res.consume()

我注意到 .consume() 函数调用 list(self) 来迭代所有结果(StatementResult 类定义了一个 __iter__方法)。因此,虽然我还没有测试过,但可能只是循环遍历结果就可以为您消耗:

res = session.run(statement)
for r in res:
continue

希望这对您有所帮助!

关于python - Neo4j 驱动程序 - 确认交易成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37381833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com