gpt4 book ai didi

python - 删除后 SQLAlchemy 仍然能够从 session 中获取对象

转载 作者:行者123 更新时间:2023-12-02 15:10:34 29 4
gpt4 key购买 nike

我有一个端点可以从我的数据库中删除一个对象。我用下面的代码删除它:

my_object = Object.query.get(id)
db.session.delete(my_object)
db.session.commit()
return json.dumps({'success': True}

我有一个 API 测试来测试我创建对象的端点,然后使用端点删除它。我试图在删除发生后断言它不在数据库中。

my_object = MyObject()
db.session.add(my_object)
db.session.commit()
response = requests.delete('{}/my-object/{}'.format(
os.environ.get('MY_URL'),
my_object.id
))
self.assertTrue(response.json()['success']) // this passes
self.assertEqual(200, response.status_code) // this passes
result = db.session.query(MyObject).get(my_object.id)
print(result.id) // prints the id of the job even though it is deleted from the database

我认为这与某些 SQLAlchemy session 缓存有关。我试过 db.session.flush(), db.session.expire_all() 都没有用。该对象实际上正在从数据库中删除。所以我希望查询结果为 None

我在文档中看到了这一点,但还没有完全理解它。 when to commit and close a session

感谢您的帮助。

最佳答案

所以在您的测试代码中,您将对象添加到 session 中并提交它。它被保存到数据库中,并且是您 session 的身份映射。

然后您点击您的应用程序,它有自己的 session 。它删除了对象并提交,现在它已经从数据库中消失了。但是……

您之前的 session 对此一无所知,当您使用 .get() 时,它将返回其标识映射中的内容:一个带有 ID 的 Python 对象。它不会重新获取,除非您关闭 session 或强制从数据库刷新(我不记得 OTOH 如何执行此操作,但您可以,它在文档中的某个地方)。如果您使用干净的第三个 session ,它将有一个新的身份映射,并且不会保留对 python 对象的引用,因此您会得到您期望的结果,即。没有结果。这是设计使然,因为 Identity Map 允许 SQLAlchemy 将一堆更改链接在一起,形成一个仅在您提交时触发的最佳 SQL 查询。

是的,您看到从身份映射中提取的数据仍然存在。 (您甚至可以在交互式解释器中将其弹出并四处查看)这是有道理的,因为假设您有两个不同 Web 请求的线程,并且当另一个请求删除该对象时,其中一个线程正在对一个对象执行一些生命周期更长的操作。第一个线程不应该吐出使用该对象的 Python 代码,因为无论您在代码中的什么位置,这都会触发随机异常。它应该只是认为它可以做它的事情,然后在提交时失败,触发回滚。

HTH

关于python - 删除后 SQLAlchemy 仍然能够从 session 中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44188905/

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