Python MySQL无法使用包含25k条记录的数据集进行更新

Python MySQL无法使用包含25k条记录的数据集进行更新,python,mysql,mysql-python,execute,executemany,Python,Mysql,Mysql Python,Execute,Executemany,重要细节: mysql连接器python==8.0.18 我使用的是pypy3,它是Python3的替代实现 bulk_数据列表中的每个项目都是一个包含两个项目的dict对象,每个键不超过10个字符,每个值不超过40个字符 目前,我有一个约25k条记录的记录集,其中包含两条数据。我试图用这些信息更新数据库中的行,但无论我尝试什么,我都会收到“在执行多个语句时使用multi=True”作为错误 奇怪之处如下: 1.我使用(sql,data_set)尝试将其作为批量数据集。这不能使用“multi

重要细节:

  • mysql连接器python==8.0.18
  • 我使用的是pypy3,它是Python3的替代实现
  • bulk_数据列表中的每个项目都是一个包含两个项目的dict对象,每个键不超过10个字符,每个值不超过40个字符
目前,我有一个约25k条记录的记录集,其中包含两条数据。我试图用这些信息更新数据库中的行,但无论我尝试什么,我都会收到“在执行多个语句时使用multi=True”作为错误

奇怪之处如下: 1.我使用(sql,data_set)尝试将其作为批量数据集。这不能使用“multi=True” 2.我将其分解为单个更新,并使用execute(sql,multi=True)

我在下面提供了一个使用“executemany”的代码示例,假设bulk_数据是我的数据集的一个小版本:

  bulk_data = [{'item_1':"TEST", 'item_2':"TEST2"}, {'item_1':"TEST3", 'item_2':"TEST4"}]
  self.setup_mysql_con()
  cursor = self._mysql.cursor()

  update_sql = """
  UPDATE `db_name`.`db_table`
  SET `column_1` = %(item_1)s
  WHERE `column_2` = %(item_2)s;
  """
  try:
    cursor.executemany(update_sql, bulk_data)
    self._mysql.commit()
  except Exception as es:
    self.print(str(es))
    self.print('[{}] Error updating records in DB.'.format(
    time.strftime("%H:%M:%S", time.localtime())))
    pass

  cursor.close()
  self.close_mysql()
我之所以保留上述内容,是因为这是一个应该可以工作的代码示例,如果需要,我可以恢复。下面是该流程当前的工作设置

group_count = 1000
loop_num = 1
count = 0

total = len(data_list)

if total > 0:
  self.setup_mysql_con()
  cursor = self._mysql.cursor(buffered=True)

  while count < total:
    sub_data = data_list[(loop_num - 1) * group_count: loop_num * group_count]
    count = count + len(sub_data)
    update_sql = ""

    for data in sub_data:
      update_sql = update_sql + "UPDATE `db_name`.`db_table` SET `column` = '{}'
      WHERE `column_2` = '{}';\n".format(
                                         data['column_data'],
                                         data['column2_data']
                                         )

    loop_num = loop_num + 1

    try:
      for result in cursor.execute(update_sql, multi=True):
        if result.with_rows:
          self.fprint("Rows produced by statement '{}':".format(result.statement))
        else:
          self.fprint("Number of rows affected by statement '{}': {}".format(result.statement, result.rowcount))
      self._mysql.commit()
    except Exception as es:
      self.fprint(str(es))
      pass

  cursor.close()
  self.close_mysql()
组计数=1000
循环数=1
计数=0
总计=长度(数据列表)
如果总数>0:
self.setup\u mysql\u con()
cursor=self.\u mysql.cursor(buffered=True)
当计数<总数时:
子数据=数据列表[(循环数-1)*组数:循环数*组数]
计数=计数+长度(子单元数据)
更新_sql=“”
对于sub_数据中的数据:
update\u sql=update\u sql+“update`db\u name`.`db\u table`SET` column`='{}”
其中'column_2`='{}';\n'。格式(
数据['column_data'],
数据['column2_数据']
)
循环数=循环数+1
尝试:
对于cursor.execute(update_sql,multi=True)中的结果:
如果result.with_行:
fprint(“由语句“{}”生成的行:”.format(result.statement))
其他:
fprint(“受语句“{}”影响的行数:{}”。格式(result.statement,result.rowcount))
self.\u mysql.commit()
除以下例外情况外:
自我打印(str(es))
通过
cursor.close()
self.close_mysql()
上述代码在第四次循环后出现的错误,并不总是相同的: 对具有多个查询的语句使用cmd\u query\u iter。


您可以假设上面的更新文本是100%正确的。为了确定这一点,我还将SQL语句导出到一个文本文件中,然后在数据库中运行该文本文件,以确保获得正确的结果,并且这些结果是正确的。但是,这不是一个可扩展的解决方案,我正在自动化此过程,因此通过cron启动此过程的能力非常重要。

我忘了添加。如果我取前500条左右的记录,这是没有问题的。只有当它是一个大数据集时,才会导致ExecuteMy出现问题。如果我循环遍历数据集并使用通用的“execute”,情况也是一样的。它适用于前1000条左右的记录,然后由于相同的错误而开始失败。请尝试使用此->cur.executemany(“更新db_表集列_1=%s,其中列_2=%s”),[((“项_1”,“测试”),(“项_2”,“测试2”),(“项_1”,“测试3”),(“项_2”,“测试4”))@GiovaniSalazar-我尝试了您的解决方案,结果与上述类似。一些更新:我尝试了更多的东西。我已将我的更新分为多个批次,这些更新如上所述失败。正如代码现在所示,它循环遍历我的数据集,一次捕获1000条记录,循环遍历这些记录并创建一个更新字符串。然后与multi=true iterable cursor.execute一起使用。这适用于大约4k的记录,然后我收到一个错误,上面说“使用cmd\u query\u iter生成包含多个查询的语句”,我在上面添加了这个代码块。