我在做一个个人项目。这个论坛上有很多类似的问题,但每个人都是具体情况。在我的例子中,我正在创建和加载临时表,我正在将该表与DB中的现有表连接起来,并根据临时表的结果更新相同的表。当执行db.execute_insert_update()
时,它抛出一个异常:mysql.connector.errors.DatabaseError: 1412 (HY000): Table definition has changed, please retry transaction
> def _create_and_load_table(self, dataframe: DataFrame) -> str: #first_function
self._log_entry()
temp_table_name = self._generate_table_name()
table_schema = "partner_staging"
table_with_schema = f"{table_schema}.{temp_table_name}"
self.df_mgr.jdbc_write(dataframe=dataframe, dbtable=table_with_schema,
check_count_before_write=True)
self._log_exit()
return temp_table_name
def reconcile_partner_payments(self, dataframe: DataFrame) -> NoReturn: #second function
self.logger.info("Start reconcile_partner_payments")
self.logger.info(f"df_col:{dataframe.columns}")
partner_payment_ids = dataframe.select("partner_payment_id",
"effective_payroll_date").distinct()
self.logger.info(f"head:{partner_payment_ids.head(3)}")
self.logger.info(f"count:{partner_payment_ids.count()}")
self.logger.info(f"c:{partner_payment_ids.columns}")
temp_table_name = self._create_and_load_table(partner_payment_ids)
table_schema = "partner_staging"
update_query = """UPDATE abc.partner_payment as pp
JOIN partner_staging.{temp_table_name} as t on pp.id =
t.partner_payment_id
SET pp.reconciled = 1, pp.modify_ts = NOW() , pp.modify_user = 'ok
successfull'"""
self.db.execute_insert_update(query_sql=update_query)
self.db.drop_table(table_schema, temp_table_name)
self.logger.info("End reconcile_partner_payments")
def execute_insert_update(self, query_sql, args=()) -> None: #method being used in second_function
try:
cursor = self.get_cursor()
self.start_transaction()
cursor.execute(query_sql, args)
self._connection.handle_unread_result()
self.commit()
except Error as e:
stack = traceback.format_exc()
self.rollback()
print(stack)
logger_func = Cache()[keys.LOGGER].info if keys.LOGGER in Cache() else print
logger_func(f"stack_: {stack}")
raise e
finally:
self.close_cursor()
> def _generate_table_name(self):#generate unique name
self.logger.info("Start _generate_table_name")
rand_str = random_str(length=4)
self.logger.info("End _generate_table_name")
return f"temp_{self.partner_name}_{self.company_name}_{self.payroll_name}_{rand_str}"
我尝试定义临时表的模式,但它是相同的错误。
1条答案
按热度按时间tag5nh1u1#
在我看来,你一次运行了不止一个你给我们看的程序。而且,我猜第二个示例首先创建了一个表,您认为它是临时的,但实际上它是一个与第一个示例名称完全相同的永久表。第二个程序执行
CREATE TABLE
,而第一个程序正在使用表,随之而来的是混乱,DBMS说“我给予!我不知道你想要什么!”如何解决这个问题?
1.每次运行程序时为临时表生成一个随机的或其他唯一的名称,或者…
1.确保ORM在创建临时表时使用
CREATE TEMPORARY TABLE tablename
。临时表名的作用域是连接和模式,因此您可以在不同的示例中使用相同的名称。