2016-09-29 10 views
0

コミットに失敗した後にSQLAlchemyでロールバックを呼び出す必要があるのでしょうか?何らかのエラーが発生した場合は、オブジェクトの保存を続行します。トランザクション保存については気にしません。自動コミット= FalseでSqlalchemyでロールバックを呼び出すべきですか?

engine = create_engine("db", convert_unicode=True, echo=False) 
Session = scoped_session(sessionmaker(bind=engine, autocommit=False)) 

for row in data: 
    try: 
     Session.add(row) 
     Session.commit() 
    except: 
     # rollback ??? 

     # continue saving rest of the objects 
     continue 

Session.remove() 

答えて

1

あなたが自動コミットせずにSqlachemyを使用する場合、あなたはsession.commit()session.rollback()を呼び出すことによって、手動でTransactions状態を維持する必要があります。ドキュメントへの便利なリンクはonetwoです。

しかし、あなたの例では、rowごとに1つのトランザクションを提供しています。いずれかのトランザクションが失敗すると、現在の行は保存されず、コードは次の行の新しいトランザクションを生成します。

この場合、パフォーマンスにはautocommit=Falseを使用する利点はありません。 データセットが大きい場合、それを別々のチャンクに分割し、チャンクごとに1つのトランザクションを使用することができます。または、自動コミットオプションを使用して、トランザクションの状態について心配する必要はありません。

関連する問題