2

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

我有一个首先设置实例变量的类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: Object '<User at 0x7f4918172890>' is already attached to session '1' (this is '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() 调用失败并显示与上述相同的already attached to session '1'消息。

为什么对象附加到不同的会话而不是同一个会话?我该如何正确地做到这一点?

4

2 回答 2

0

确保类中的 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,如果你想更新记录。

于 2017-12-05T03:22:16.607 回答
-1

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

您可以按以下方式执行您的确切要求:

第一步:查询已有的用户对象

user = models.User.query.filter_by(entity=self.entityUrl).first()

第2步:

if user is not None:
     user.foo = bar
else:
    user = User(...)
    db.session.add(user) 

第 3 步:提交数据库会话。

db.session.commit()
于 2013-01-02T20:07:42.740 回答