SQL Alchemy コア バージョン 1.1 を使用していますが、falcon (python) アプリケーション内でトランザクションを動作させることができないようです。私の知る限り、ドキュメントに正しく従いました。
編集: データベース postgresql -> 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()ステートメントに従って得られる結果:
- トランザクション オブジェクト -> ロールバックしませんでした
- トランザクション オブジェクト -> ロールバックします:D
- トランザクション オブジェクト -> ロールバックします:D
テーブルの中を見ると、organization_types_table
3 つのレコードが含まれているのに 1 つのレコードが含まれていることがはっきりとわかります。トランザクションに従ってロールバックしorganization_type_names
ないのはなぜですか?organization_types_table