SQL Alchemy - 交易无效

时间:2016-03-15 18:43:31

标签: python sqlalchemy spring-transactions falcon

我正在使用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()语句得到的结果:

  1. 交易对象 - >我没有回滚
  2. 交易对象 - >我回滚:D
  3. 交易对象 - >我回滚:D
  4. 如果我查看表格,我可以清楚地看到organization_types_table包含3条记录而organization_type_names包含1.为什么organization_types_table不会根据交易回滚?

1 个答案:

答案 0 :(得分:1)

你需要做

self.connection.execute(query)

而不是

query.execute()

query.execute()在引擎上执行query,该引擎获取新连接,而不是使用您打开事务的连接。