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 插入的主要内容,如果未能解决你的问题,请参考以下文章
Python3 | sqlite3:executemany() 不插入任何内容