SQL Alchemy - 交易无效
SQL Alchemy - Transaction isn't working
我正在使用 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 条记录,而 organization_type_names
包含 1 条记录。为什么 organization_types_table
不根据事务回滚?
你需要做
self.connection.execute(query)
而不是
query.execute()
query.execute()
在引擎上执行 query
,这会获取一个新连接,而不是使用您打开事务的那个连接。
我正在使用 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 条记录,而 organization_type_names
包含 1 条记录。为什么 organization_types_table
不根据事务回滚?
你需要做
self.connection.execute(query)
而不是
query.execute()
query.execute()
在引擎上执行 query
,这会获取一个新连接,而不是使用您打开事务的那个连接。