我已经整理了一个简单的测试用例:
account = EmailAccount()
account.email = "some@mail"
assert db.account_by_mail("some@mail") == []
db.add_node(account)
assert db.account_by_mail(account.email) == [account]
db.delete_node(account))
assert db.account_by_mail("some@mail") == []
一直顺利到最后一行,抛出异常:
Neo.DatabaseError.Statement.ExecutionFailure: Node 226 has been deleted
最后一行执行的语句如下:
MATCH (account:Account) WHERE account.email = {mail} RETURN account, id(account), head(labels(account))
带参数
{
'mail': "some@mail"
}
所有语句都在同一个事务中执行(我们使用py2neo Transaction类,包含在会话包装器中 - db)。该行为与删除语义(link here)完全一致,因为事务尚未被提交,语句是读取而不是写入。还有其他隐藏的约束吗?这是默认行为,如果是,可以更改(因为我假设大多数其他dbms不会这样做)?
答案 0 :(得分:0)
最新版本的py2neo使用惰性方法进行节点提交,以避免不必要的网络流量(请参阅http://py2neo.org/2.0/intro.html#nodes-relationships)。因此,您必须直接将更改提交到图表,以便保留它们。如果我没有更明确地看到你的db代码,如果我理解正确,你就不会将你的事务提交给图形,因此,你只是修改了尚未持久存在的对象的状态。
此行为与其他orm实现(如SQL Alchemy(python)或Hibernate(Java))一致,并且密切反映了在dbms级别发生的实际事务划分。