Django:使用带有 executemany 和 MySQL 的自定义原始 SQL 插入

Posted

技术标签:

【中文标题】Django:使用带有 executemany 和 MySQL 的自定义原始 SQL 插入【英文标题】:Django: Using custom raw SQL inserts with executemany and MySQL 【发布时间】: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) 以提高效率。

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

【问题讨论】:

【参考方案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,您将遇到非常不幸的性能下降。解决方法是使用小写的“值”。严重地。见***.com/questions/3945642/…

以上是关于Django:使用带有 executemany 和 MySQL 的自定义原始 SQL 插入的主要内容,如果未能解决你的问题,请参考以下文章

带有简单列表的 psycopg2 executemany?

ExecuteMany 插入错误的值

Python3 | sqlite3:executemany() 不插入任何内容

如何使用 executemany 处理异常(MySQL 和 Python)

混合占位符、executemany 和表名

Executemany混乱