Я хочу либо обновить строку в базе данных, если она существует, либо создать ее, если ее нет.
У меня есть класс, который сначала устанавливает переменную экземпляра 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'
, что и выше.
Почему объект привязан к другому сеансу, а не к тому же? Как мне это сделать правильно?