【问题标题】:Django: Using custom raw SQL inserts with executemany and MySQLDjango:使用带有 executemany 和 MySQL 的自定义原始 SQL 插入
【发布时间】:2011-05-16 22:40:26
【问题描述】:

我需要将大量数据上传到 MySQL 数据库。对于大多数模型,我使用 django 的 ORM,但我的一个模型将有数十亿(!)个实例,我想优化它的插入操作。

我似乎找不到让 executemany() 工作的方法,在谷歌搜索之后似乎几乎没有示例。

我正在寻找正确的 sql 语法 + 正确的命令语法 + 正确的值数据结构来支持以下 sql 语句的 executemany 命令:

INSERT INTO `some_table` (`int_column1`, `float_column2`, `string_column3`, `datetime_column4`) VALUES (%d, %f, %s, %s)

是的,我明确说明了 id (int_column1) 以提高效率。

一个简短的示例代码会很棒

【问题讨论】:

    标签: sql mysql django insert


    【解决方案1】:

    您是否真的建议通过一些 ORM 数据访问层加载数十亿行(抱歉的实例)数据 - 您有多长时间?

    尽可能批量加载 - http://dev.mysql.com/doc/refman/5.1/en/load-data.html

    【讨论】:

    • 我想你错过了我写的地方很有帮助谢谢
    • 另外,我不能真正使用加载数据,因为我在将数据输入到数据库之前会对其进行操作......
    • 最后,是的,这很重要,即使插入数据库需要几天时间。这是一次操作(直到下一次......)
    • 为什么不编写一个 Dump2CSV 方法来处理您的实例并创建一系列可以加载到数据库中的 .dat 文件?
    • 所以我猜你的意思是,无论对数据的修改是什么,我都应该将加载过程与数据操作部分分开,并使用 load-data 加载
    【解决方案2】:

    如果您需要修改数据,请按原样将load data 批量加载到临时表中。然后使用insert into select 命令应用修改。 IME,这是迄今为止将大量数据放入表中的最快方法。

    【讨论】:

      【解决方案3】:

      我不知道如何使用 executemany() 命令,但你可以use a single SQL INSERT statement to insert multiple records

      【讨论】:

        【解决方案4】:

        这是一个实际使用 executemany() 的解决方案!

        基本上,示例here 中的想法可行。

        但请注意,在 Django 中,您需要使用 %s 占位符而不是问号。

        此外,您还需要管理您的交易。因为有很多可用的文档,所以我不会在这里讨论。

            from django.db import connection,transaction
            cursor = connection.cursor()
            
            
            
            query = ''' INSERT INTO table_name 
                    (var1,var2,var3) 
                    VALUES (%s,%s,%s) '''
            
            
            query_list = build_query_list() 
            
            # here build_query_list() represents some function to populate
            # the list with multiple records
            # in the tuple format (value1, value2, value3).
            
            
            cursor.executemany(query, query_list)
            
            transaction.commit()
        
        

        【讨论】:

        • 晚了半年,但终于得到了关于 executemany() 的答案。我尚未测试您的答案,但我接受它并希望您的代码有效
        • 我在任何地方都找不到函数 buildQueryList() 的文档。它是 Django 的一部分吗?
        • 如果您阅读 cmets...由您根据应用程序的特定需求/数据库架构构建该功能...#here buildQueryList() 表示一些用于填充 #the 列表的功能多条记录#元组格式(value1,value2,value3)。
        • 对于未来寻找相同事物的人:jsh 的 sn-p 有效。谢谢
        • 请注意,如果您使用 MySQLdb 1.2,您将遇到非常不幸的性能下降。解决方法是使用小写的“值”。严重地。见stackoverflow.com/questions/3945642/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 2020-11-20
        • 2014-09-30
        相关资源
        最近更新 更多