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

2024-07-21 1635阅读

文章目录

  • 错误一
    • 错误原因
    • 解决方案
    • 错误二
      • 原因
      • 解决方案

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

        错误一

        错误原因

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

        PyMysql error : Packet Sequence Number Wrong - got 1 expected 0
        (图片来源网络,侵删)

        解决方案

        换成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))
        
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]