データベース内の行が存在する場合は更新し、存在しない場合は作成します。
最初にインスタンス変数を設定するクラスがあります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'
上記と同じメッセージで失敗します。
オブジェクトが同じセッションではなく別のセッションに接続されているのはなぜですか? これを正しく行うにはどうすればよいですか?