3

ちょっとした質問があります。データの長い配列を DB に挿入していますが、新しい行の一部が IntegrityError 例外をスローすることがあります。それは問題ありません。私はそれらを簡単に認識できます。問題は、この「偽の」挿入を元に戻すためにロールバックすると、以前の行もすべて削除されることです。

次にやりたいことは、直前の状態にロールバックして、次の挿入を続行することです。

import sqlalchemy as alc

def insert(self, specs):
    #do stuff to transfor specs in data_db

    entry = Check_Point(data_db)
    session.add(entry)

    try:
        session.flush()

    except alc.exc.IntegrityError:
        print 'int Error'
        session.rollback()

ということで、ちょっと調べてみるとこんなのがありました。

http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#using-savepoint

for record in records:
    try:
        with session.begin_nested():
            session.merge(record)
    except:
        print "Skipped record %s" % record
session.commit()

しかし、「レコード」が挿入されるオブジェクトの配列である場合 (私の場合は Check_Point のインスタンス)、実際には機能しません。次のエラーが表示されます。

このセッションのトランザクションは、ネストされた rollback() 呼び出しによってロールバックされました。新しいトランザクションを開始するには、最初に Session.rollback() を発行します

問題の解決に近づいていますが、助けが必要です。

前もって感謝します!

4

1 に答える 1

2

現在、 PySQLiteのバグにより、トランザクションはSQLAlchemySQLite3SAVEPOINTで正しく動作しません。バグとSQLAlchemyでのバグ回避の複雑さに関する Michael Bayer の詳細な説明については、この SQLAlchemy Google グループの投稿を参照してください。

于 2012-10-27T05:14:55.303 に答える