Откат 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_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_to_sql() функции, и всякий раз, когда я обрабатываю это исключение ( sqlalchemy.exc.DBAPIError ), table2 обновляется новыми данными (посредством обработки исключения), но ни того, ни другого table1 нет table3 , и я получаю ошибку: sqlalchemy.exc.InvalidRequestError: This transaction is inactive .

Похоже, это как-то связано с областью отката или завершением сеанса перед фиксацией или чем-то в этом роде, но я не могу понять это.