0

SQL Alchemy コア バージョン 1.1 を使用していますが、falcon (python) アプリケーション内でトランザクションを動作させることができないようです。私の知る限り、ドキュメントに正しく従いました。

編集: データベース pos​​tgresql -> psycopg2cffi

def __init__(self, *args, **kwargs):
    self.__conn_url__ = settings.get_db_url()
    self.db_engine = create_engine(self.__conn_url__)
    self.db_engine.echo = False
    self.metadata = MetaData(self.db_engine)
    self.connection = self.db_engine.connect()
    self.organization_types_table = Table('organization_types', self.metadata, autoload=True)
    self.organization_type_names_table = Table('organization_type_names', self.metadata, autoload=True)

def post(self, json_data):
    transaction = self.connection.begin()
    print(transaction)
    try:
        results = self.organization_types_table.insert().\
            values(date_created=datetime.datetime.now()).\
            execute()

        organization_types_id = results.inserted_primary_key

        results = self.organization_type_names_table.insert().\
            values(organization_types_id=organization_types_id[0],
                   lang=json_data['lang'],
                   name=json_data['name']).\
            execute()

        transaction.commit()
        print("I didn't rollback")
        return results
    except:
        transaction.rollback()
        print("I rollback :D")
        raise

このコードを複数回実行すると、同じオブジェクトが挿入されます。インデックスの制約により重複が許可されていないため、初めて機能するはずです。

私のprint()ステートメントに従って得られる結果:

  1. トランザクション オブジェクト -> ロールバックしませんでした
  2. トランザクション オブジェクト -> ロールバックします:D
  3. トランザクション オブジェクト -> ロールバックします:D

テーブルの中を見ると、organization_types_table3 つのレコードが含まれているのに 1 つのレコードが含まれていることがはっきりとわかります。トランザクションに従ってロールバックしorganization_type_namesないのはなぜですか?organization_types_table

4

1 に答える 1

1

あなたがする必要があります

self.connection.execute(query)

それ以外の

query.execute()

query.execute()queryトランザクションを開いているエンジンを使用する代わりに、新しい接続を取得するエンジンで実行されます。

于 2016-03-15T20:03:43.963 に答える