PyMysql error : Packet Sequence Number Wrong - got 1 expected 0


我自己知道的,这类问题有两类原因,两种解决方案。

错误一

错误原因

pymysql的主进程启动的connect无法给子进程中使用,所以读取大批量数据时最后容易出现了此类问题。

解决方案

换成pymysql-pool可以解决方法:
具体如下:

pip install pymysql-pool

代码如下:

import pymysql
import pymysqlpool

def select_ebay_catelotory():
    config={'host': HOST, 'user': USER, 'password': PASSWD, 'database': DB, 'autocommit':True}
    pool1 = pymysqlpool.ConnectionPool(size=10, maxsize=20, pre_create_num=2, name='pool1', **config)
    con1 = pool1.get_connection()
    gcu = con1.cursor()
    try:
        gcu.execute(f"""SELECT *** """)

        # 获取剩余结果所有数据
        rows = gcu.fetchall()
    except Exception as e:
        print(e)
    finally:
        # gcu.close()
        con1.close()
    return rows

错误二

原因

要读取的内容太大了。有两类:某列太长了,总行数太多了。

如何确定?
你的代码读取100行没问题,1000行也没问题,10000行也没问题,100万行就有问题了。那就是这个原因。

解决方案

不要limit去读,太费时间:先取id,再用id去分批读取数据。

import pymysql
import pymysqlpool

def select_all_ids():
    config={'host': HOST, 'user': USER, 'password': PASSWD, 'database': DB, 'autocommit':True}
    pool1 = pymysqlpool.ConnectionPool(size=35, maxsize=35, pre_create_num=2, name='pool1', **config)
    con1 = pool1.get_connection()
    gcu = con1.cursor()
    try:
        gcu.execute(f"""SELECT `id` FROM sfc_minesweeper.product_detail WHERE create_time>'2024-07-10' AND CHAR_LENGTH(result_data)>500""")

        # 获取剩余结果所有数据
        rows = gcu.fetchall()
    except Exception as e:
        print(e)
    finally:
        # gcu.close()
        con1.close()
    return rows


def select_ebay_catelotory(pids):
    config={'host': HOST, 'user': USER, 'password': PASSWD, 'database': DB, 'autocommit':True}
    pool1 = pymysqlpool.ConnectionPool(size=35, maxsize=35, pre_create_num=2, name='pool1', **config)
    con1 = pool1.get_connection()
    gcu = con1.cursor()
    try:
        gcu.execute(f"""SELECT `id`, `result_data`, `product_offer_id` FROM sfc_minesweeper.product_detail WHERE id in {tuple(pids)}""")

        # 获取剩余结果所有数据
        rows = gcu.fetchall()
    except Exception as e:
        print(e)
    finally:
        # gcu.close()
        con1.close()
    return rows

# 先拿到所有id
pd_ids = [e[0] for e in select_all_ids()]
# 再分批读取
pd1688s = []
step = 4000
for begin in range(0, len(pd_ids), step):
    pd1688s.extend([e for e in select_ebay_catelotory(pd_ids[begin:begin+step])])
    print(i, len(pd1688s))

相关推荐

  1. PyMysql error : Packet Sequence Number Wrong - got 1 expected 0

    2024-07-15 00:38:03       21 阅读
  2. go-Expect-实验

    2024-07-15 00:38:03       30 阅读
  3. gst-play-1.0

    2024-07-15 00:38:03       29 阅读
  4. zynq gst-launch-1.0相关

    2024-07-15 00:38:03       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 00:38:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 00:38:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 00:38:03       58 阅读
  4. Python语言-面向对象

    2024-07-15 00:38:03       69 阅读

热门阅读

  1. TCP和UDP知识点

    2024-07-15 00:38:03       21 阅读
  2. 【C++】指针学习 知识点总结+代码记录

    2024-07-15 00:38:03       19 阅读
  3. 游戏开发面试题1

    2024-07-15 00:38:03       17 阅读
  4. 利率债与信用债的区别及其与债券型基金的关系

    2024-07-15 00:38:03       19 阅读
  5. 域名信息的收集

    2024-07-15 00:38:03       19 阅读
  6. DelphiXE内存泄漏问题,已经发生了很多次

    2024-07-15 00:38:03       23 阅读