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

-1

Flask-SQLAlchemy を使用して既存のレコードを更新するために、User オブジェクト全体を再作成してセッションに追加する必要はありません。特定のフィールド (例: foo) を更新するだけです。その後、db commit を実行できます。

以下のように正確な要件を実行できます。

ステップ 1: 既存のユーザー オブジェクトを照会する

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 セッションをコミットします。

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