1
特定のテーブルで挿入が行われた後にいくつかの操作を実行しようとしています。SAWarning: 'Session.add()'操作の使用は、現在のところ実行ステージ内ではサポートされていません。
user = ModelFactory.create_user(username, email, password)
db.session.add(user)
db.session.commit()
だから私はafter_insert
に自動的に呼び出すメソッドを作成しました。
SAWarning: Usage of the 'Session.add()' operation is not currently supported within the execution stage of the flush process. Results may not be consistent. Consider using alternative event listeners or connection-level operations instead.
% method)
/home/avinash/.virtualenvs/s2s/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py:68: SAWarning: An exception has occurred during handling of a previous exception. The previous exception is:
<class 'sqlalchemy.exc.ResourceClosedError'> This transaction is closed
Thisポスト
def notify_user(user):
print user.id
book = Book(author=user.id, name='foo')
db.session.add(book)
db.session.commit(book)
@event.listens_for(User, 'after_insert')
def receive_after_insert(mapper, connection, target):
print target
notify_user(target)
しかし、このコードは警告などを示したが、我々はbefore_flush
で仕事をしなければならないことを示しています。 before_flushメソッド内でロジックを移動しようとしましたが、user.idがNoneであることが示されています。はい、エンティティはdbにコミットされないため、これが期待されます。
同様に、私はafter_flush
イベントを試しましたが、同じ警告が表示されます。
通知ユーザーメソッドの開始時に、db.session.flush()を追加しました。 –
@AvinashRaj ORMを最大限に活用していないような気がします。 ORMの主な特徴は、オブジェクトを挿入する順序を把握して外部キーを埋めることができることです。 – univerio
あなたは 'セッション'として 'db.session'を意味していますか? –