我想要更新数据库中的一行(如果存在),或者如果不存在则创建它。
我有一个类首先设置实例变量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'
消息。
为什么对象附加到不同的会话而不是同一个会话?我该如何正确地做到这一点?
答案 0 :(得分:0)
确保您班级中的foo属性存在。接下来,也许你使用它的方式有问题。因为我看到你使用&#34; self.user ....&#34;。首先尝试最简单的事情。然后一步一步。
以下代码错误:
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 :(得分:-1)
要使用Flask-SQLAlchemy更新现有记录,您无需重新创建整个User对象并将其添加到会话中。您只需更新特定字段(例如foo)即可。然后,您可以执行数据库提交。
您可以按照以下方式执行您的确切要求:
user = models.User.query.filter_by(entity=self.entityUrl).first()
if user is not None:
user.foo = bar
else:
user = User(...)
db.session.add(user)
db.session.commit()