Szp*_*ona 2 python neo4j neo4j-python-driver
我刚刚开始使用新的用于 python 的 neo4j 驱动程序并完全陷入事务中。如何检查交易是否成功完成?据我所知,commit函数不会自动引发任何错误,例如,如果我向它提供了不正确的 Cypher 查询,我将无法获得有关此的信息。
我尝试last_result从Session对象中读取参数并想出了类似的东西:
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
Run Code Online (Sandbox Code Playgroud)
它有点工作......但是,它确实需要修改私有属性,而且似乎不正确/不正确。必须有一个更简单、更优雅的解决方案。
预先感谢您的帮助。
编辑:只是为了清楚说明Transaction.success属性指示事务是否应该提交或回滚。然而,例如 Cypher 错误可以在查询的执行时间被识别。
在我提供开发人员手册之前,我一直在同一件事上撞头阅读。
在那之前,我无法弄清楚为什么运行几个错误的语句session.run(statement)不会引发异常,而是session.close()会。
然后我尝试使用类似的东西:
with session.begin_transaction() as tx:
tx.run(statement)
tx.success = True
Run Code Online (Sandbox Code Playgroud)
如果你不想要上下文管理器,你可以使用:
tx = session.begin_transaction()
tx.run(statement)
tx.commit()
Run Code Online (Sandbox Code Playgroud)
如果您阅读了python 文档,您可能会注意到tx.commit()运行tx.success=True和tx.close().
这样做的问题是,调用commit()只会将COMMIT密码消息附加到连接的流中。据我所知,它不会验证交易是否成功。
看了手册的第18节,发现因为我没有显式消费结果,所以不能保证语句被处理是因为库使用了延迟加载(仅按需检索结果)。请参阅下面 18.1 中的注释:
“当光标在流中移动时,结果记录被延迟加载。这意味着必须将光标移动到第一个结果才能消费这个结果。这也意味着必须在摘要信息和元数据之前显式消费整个流可用。通常最佳做法是显式使用结果并关闭会话,尤其是在运行更新语句时。即使不需要摘要信息,这也适用。未能使用结果可能导致不可预测的行为,因为将无法保证服务器已经看到并处理了 Cypher 语句。”
因此,本质上,您需要在运行 cypher 语句后显式使用您的结果。这可以像这样完成:
res = session.run(statement) # or the equivalent iusing transaction style
res.consume()
Run Code Online (Sandbox Code Playgroud)
我注意到迭代所有结果的.consume()函数调用list(self)(StatementResult 类定义了一个__iter__方法)。所以,虽然我没有测试过它,但可能只是简单地循环结果为你消耗:
res = session.run(statement)
for r in res:
continue
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助!