Python Peewee MySQL批量升级

2024-09-30 20:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python2.7、Peewee和MySQL。我的程序从csv文件读取,如果csv中存在订单号,则更新字段。可以有2000-3000个更新,我用朴素的方法逐个更新记录,速度非常慢。我已经从使用peeweeupdate转移到了Raw query,这有点快。然而,它仍然非常缓慢。我想知道如何在不使用循环的情况下用更少的事务更新记录。在

def mark_as_uploaded_to_zoho(self, which_file):
    print "->Started marking the order as uploaded to zoho."
    with open(which_file, 'rb') as file:
        reader = csv.reader(file, encoding='utf-8')
        next(reader, None) ## skipping the header

        for r in reader:
            order_no = r[0]
            query = '''UPDATE sales SET UploadedToZoho=1 WHERE OrderNumber="%s" and UploadedToZoho=0''' %order_no
            SalesOrderLine.raw(query).execute()

    print "->Marked as uploaded to zoho."

Tags: csvthetonowhichas记录order
1条回答
网友
1楼 · 发布于 2024-09-30 20:35:57

{a1}你可以使用这个限制来提高速度。这需要一个迭代器,该迭代器返回模型字段与字典键匹配的字典对象。在

根据要插入的记录数,您可以一次全部插入,也可以将其拆分成更小的块。在过去,我一次插入10000多条记录,但这可能会非常慢,这取决于数据库服务器和客户机规范,所以我将展示这两种方法。在

with open(which_file, 'rb') as file:
    reader = csv.DictReader(file)
    SalesOrderLine.insert_many(reader)

或者

^{pr2}$

要获得更有效的“chunkify”迭代器的方法,请签出this question。在

通过简单地使用with db.atomic即可获得额外的加速,如here所示。在

相关问题 更多 >