在MySQL中更新表时出错:mysql.connector.errors.DatabaseError:1412(HY000):表定义已更改,请重试事务

gv8xihay  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(165)

我在做一个个人项目。这个论坛上有很多类似的问题,但每个人都是具体情况。在我的例子中,我正在创建和加载临时表,我正在将该表与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}"

我尝试定义临时表的模式,但它是相同的错误。

tag5nh1u

tag5nh1u1#

在我看来,你一次运行了不止一个你给我们看的程序。而且,我猜第二个示例首先创建了一个表,您认为它是临时的,但实际上它是一个与第一个示例名称完全相同的永久表。第二个程序执行CREATE TABLE,而第一个程序正在使用表,随之而来的是混乱,DBMS说“我给予!我不知道你想要什么!”
如何解决这个问题?
1.每次运行程序时为临时表生成一个随机的或其他唯一的名称,或者…
1.确保ORM在创建临时表时使用CREATE TEMPORARY TABLE tablename。临时表名的作用域是连接和模式,因此您可以在不同的示例中使用相同的名称。

相关问题