2017-04-02 7 views
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イベントを試しましたが、同じ警告が表示されます。

答えて

1

after_flushイベントが作業を行います。

@event.listens_for(User, "after_insert") 
def receive_after_insert(mapper, connection, user): 
    print(user.id) 
    @event.listens_for(Session, "after_flush", once=True) 
    def receive_after_flush(session, context): 
     session.add(Book(author=user.id, name="foo")) 

しかし、なぜあなたの代わりにUser.author関係を作りたいではないでしょうか?

+0

通知ユーザーメソッドの開始時に、db.session.flush()を追加しました。 –

+0

@AvinashRaj ORMを最大限に活用していないような気がします。 ORMの主な特徴は、オブジェクトを挿入する順序を把握して外部キーを埋めることができることです。 – univerio

+0

あなたは 'セッション'として 'db.session'を意味していますか? –

関連する問題