Python SQLalchemy在捕获异常时回滚?
我有一个类似于以下的功能:Python SQLalchemy在捕获异常时回滚?,python,python-3.x,postgresql,sqlalchemy,Python,Python 3.x,Postgresql,Sqlalchemy,我有一个类似于以下的功能: def data_to_sql(response: pd.DataFrame, table, engine, if_exists="append"): try: response.to_sql(table, con=engine, index=False, if_exists) except: sqlalchemy.exc.DBAPIError as e: data = pd.read_s
def data_to_sql(response: pd.DataFrame, table, engine, if_exists="append"):
try:
response.to_sql(table, con=engine, index=False, if_exists)
except:
sqlalchemy.exc.DBAPIError as e:
data = pd.read_sql(f"SELECT * FROM {table}", con=engine)
new_response = pd.concat([data, response])
new_response.to_sql(table, con=engine, index=False,
if_exists="replace")
当存在未定义的列时,会发生此异常;当响应(DataFrame)中有一列不在数据库中要附加到的表中时
现在,我在另一个函数中调用此函数:
def another_function(response, table, engine, if_exists="append"):
# extract data from response here which gives us 3
# different responses which we want to append to different tables
with engine.begin() as con:
data_to_sql(response1, table=table+"1", engine=con, if_exists=if_exists)
data_to_sql(response2, table=table+"2", engine=con, if_exists=if_exists)
data_to_sql(response3, table=table+"3", engine=con, if_exists=if_exists)
现在,engine.begin()
可以确保,每当其中发生错误时,更改都会回滚到以前的状态
现在,这不是我所期望的。response2
是导致data\u to\u sql()
函数异常的原因,每当我处理此异常(sqlalchemy.exc.DBAPIError
)时,
table2
用新数据更新(通过处理异常),但是table1
nottable3
都不是,我得到一个错误:sqlalchemy.exc.InvalidRequestError:此事务处于非活动状态
这似乎与回滚范围有关,或者在提交之前终止会话,或者类似的事情有关,但我无法理解