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