Python SQLAlchemy级联删除(可能会导致会话混淆)

Python SQLAlchemy级联删除(可能会导致会话混淆),python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,当父对象被删除时,我试图将删除级联到子对象中。根据这个问题,我在孩子的backref中添加了cascade=“all,delete orphan”选项。这似乎在一定程度上起了作用。实际上,子项已从数据库中删除(通过SQLlite数据库浏览器确认),但子项仍然可见“python端”: 代码: 实际上,SQLAlchemy在这里的行为是正确的。要理解它,你必须远离炼金术。您告诉库删除其后端中的某些内容。但是,您仍然有对您自己创建的实例的引用,并且只提供了它。以这个人为的例子: some_obj =

当父对象被删除时,我试图将删除级联到子对象中。根据这个问题,我在孩子的backref中添加了
cascade=“all,delete orphan”
选项。这似乎在一定程度上起了作用。实际上,子项已从数据库中删除(通过SQLlite数据库浏览器确认),但子项仍然可见“python端”:

代码:


实际上,SQLAlchemy在这里的行为是正确的。要理解它,你必须远离炼金术。您告诉库删除其后端中的某些内容。但是,您仍然有对您自己创建的实例的引用,并且只提供了它。以这个人为的例子:

some_obj = MyClass()
backend_storage.store(some_obj)
backend_storage.delete(some_obj)
现在在您的本地空间中使用
一些对象
会发生什么?这个库应该删除你的变量吗

SQLAlchemy的行为就是这样的:它知道这些对象已经消失了,所以询问它们不会再返回它们。但是,它们仍然存在于本地,并且已经存在于本地,所以只要您有对它们的引用,它们就会一直存在于内存中

还有一件事:不管是您自己创建的还是库返回的对象。他们现在是“你的”,现在外部代码应该会弄乱这一点。例如:

some_obj = backend_storage.load_one(MyClass)  # load the first object of MyClass
backend_storage.delete(some_obj)

这与上面相同:
某些对象是您的对象。如果您愿意,您甚至可以现在重新添加它,后端将不关心。

那么这是否意味着在SQLalchemy中,为了完全摆脱我需要做的事情,我需要执行
session.delete(some_obj)
然后
session.commit()
最后
del some_obj
?我只是很惊讶ORM没有为你这么做。。。这里的例子似乎暗示你不需要。你不必显式地删除它们,只要停止使用它们就行了。如果您在某处存储了引用(例如,在所有项目的全局列表中),那么您必须小心删除它们。如果你把它想象成一个缓存,也许会有帮助:你不会希望SQLAlchemy从缓存中删除,是吗?关于这个例子:被删除的对象是'node1',如果仔细观察,任何地方都没有对它的引用。此外,SQLAlchemy确实将其从自己的集合中删除(即
node.children
)。
some_obj = MyClass()
backend_storage.store(some_obj)
backend_storage.delete(some_obj)
some_obj = backend_storage.load_one(MyClass)  # load the first object of MyClass
backend_storage.delete(some_obj)