InvalidRequestError:实例“<User at 0x7f65938a7510>”未持久化

2024-04-18 09:49:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在framework Flask中执行这样的测试,并得到消息:

InvalidRequestError: Instance '<User at 0x7f65938a7510>' is not persisted

  File "tests.py", line 31, in test_removeProfil
    db.session.delete(user)

我的测试代码:

class TestCase(unittest.TestCase):

    def test_removeProfil(self):
        user = User(name="John", age=33, email="john@john.com")
        db.session.delete(user)
        db.session.commit()
        self.assertNotEqual(user.name, "John")
        self.assertNotEqual(user.age, 33)
        self.assertNotEqual(user.email, "john@john.com")

Tags: nametestselfdbageemailsessiondelete
2条回答

您正在尝试删除一个新实例,而不是从数据库中获取的实例。要么你打算使用db.session.add(),要么你打算使用user = User.query.filter_by(email='john@john.com').first()(或类似的东西)并删除它。

您还可能在访问已删除实例的属性时遇到问题(假设您如上所述正确删除了该实例)。提交会话时,该会话中的所有实例都将过期。尝试访问过期的属性会触发数据库查找,但不能查找此对象,因为它已被删除。

您可以关闭^{},但这不是正常行为,可能会导致其他问题。

您也可以尝试在上面调用^{}

最终,您应该放弃已删除的实例。也许有更好的方法去做你想做的事情。

当你打电话

user = User(name="John", age=33, email="john@john.com")

创建python对象,而不是db中的对象。所以你需要先把它添加到数据库

db.session.add(user)
db.session.commit()

之后你可以从数据库中删除它

db.session.delete(user)
db.session.commit()

你的assertNotEqual毫无意义。您应该测试delete之前和之后select from db的结果是否不同

相关问题 更多 >