Sqlalchemy 炼金术赢了';t更新或删除行

Sqlalchemy 炼金术赢了';t更新或删除行,sqlalchemy,flask,flask-sqlalchemy,Sqlalchemy,Flask,Flask Sqlalchemy,我想更新数据库中的一行(如果存在),或者创建一行(如果不存在) 我有一个类,它首先设置实例变量user: self.user = models.User.query.filter_by(entity=self.entityUrl).first() # can be None if not found 然后,稍后在另一个类方法中,我执行以下操作: if self.user is not None: self.user.foo = bar # etc. Change the attrib

我想更新数据库中的一行(如果存在),或者创建一行(如果不存在)

我有一个类,它首先设置实例变量
user

self.user = models.User.query.filter_by(entity=self.entityUrl).first()
# can be None if not found
然后,稍后在另一个类方法中,我执行以下操作:

if self.user is not None:
    self.user.foo = bar  # etc. Change the attributes of self.user
else:
    self.user = models.User(bar, ... )  # create a new model
    db.session.add(self.user)
db.session.commit()
问题是,数据库中相应的行没有得到更新。我也尝试过这种方法:

if self.user is not None:
    self.user.foo = bar
else:
    self.user = models.User(bar, ... )
db.session.add(self.user)  # add it to the session either way
db.session.commit()
这里,db.session.add()调用失败,因为
sqlalchemy.exc.InvalidRequestError:对象“”已附加到会话“1”(这是“2”)

我尝试的第一件事是在所有情况下删除现有模型,然后创建一个新模型,即:

if self.user is not None:
    db.session.delete(self.user)
self.user = models.User(bar, ... )
db.session.add(self.user)
db.session.commit()
在这种情况下,db.session.delete()调用失败,会话“1”上已经附加了相同的
消息,如上所述


为什么对象附加到不同的会话而不是相同的会话?如何正确执行此操作?

要使用Flask SQLAlchemy更新现有记录,无需重新创建整个用户对象并将其添加到会话中。您只需更新特定字段(例如foo)即可。然后可以执行db提交

您可以按照以下具体要求进行操作:

步骤1:查询现有用户对象 步骤2: 步骤3:提交数据库会话。
要使用Flask SQLAlchemy更新现有记录,无需重新创建整个用户对象并将其添加到会话中。您只需更新特定字段(例如foo)即可。然后可以执行db提交

您可以按照以下具体要求进行操作:

步骤1:查询现有用户对象 步骤2: 步骤3:提交数据库会话。
确保类中的foo属性存在。其次,也许你使用它的方式有问题。因为我看到你使用“self.user…”。先尝试最简单的事情。然后一步一步

以下代码错误:

if self.user is not None:
    self.user.foo = bar
else:
    self.user = models.User(bar, ... )
db.session.add(self.user)  # add it to the session either way
db.session.commit()

如果要更新记录,无需
db.session.add

确保类中的foo属性存在。其次,也许你使用它的方式有问题。因为我看到你使用“self.user…”。先尝试最简单的事情。然后一步一步

以下代码错误:

if self.user is not None:
    self.user.foo = bar
else:
    self.user = models.User(bar, ... )
db.session.add(self.user)  # add it to the session either way
db.session.commit()

如果要更新记录,无需
db.session.add

这正是我的代码所做的,只是步骤1采用的方法与步骤2-3不同。数据库也不会更新。我来看看是否可以把它简化为一个最小的例子。好吧,我想你说的是“#以任何方式将它添加到会话中”。这可能就是问题所在。仅当它是新用户时,才希望将其添加到会话中。在我的步骤2中,我只在else块中添加会话。你也这么做吗?如前所述,我尝试了两种方法。如果在修改会话时将其添加到会话中,我会得到一个错误(这与您所说的一致)。如果我没有,它不会更新。“步骤1与步骤2-3采用不同的方法”。可能用户对象没有正确地传递到下一步。您可能需要检查该方法。可能是这里的邮政编码?这正是我的代码所做的,除了步骤1与步骤2-3采用不同的方法。数据库也不会更新。我来看看是否可以把它简化为一个最小的例子。好吧,我想你说的是“#以任何方式将它添加到会话中”。这可能就是问题所在。仅当它是新用户时,才希望将其添加到会话中。在我的步骤2中,我只在else块中添加会话。你也这么做吗?如前所述,我尝试了两种方法。如果在修改会话时将其添加到会话中,我会得到一个错误(这与您所说的一致)。如果我没有,它不会更新。“步骤1与步骤2-3采用不同的方法”。可能用户对象没有正确地传递到下一步。您可能需要检查该方法。请问这里的邮政编码是多少?
db.session.commit()
if self.user is not None:
    self.user.foo = bar
else:
    self.user = models.User(bar, ... )
db.session.add(self.user)  # add it to the session either way
db.session.commit()