Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django(SQL、Python、Django)中使用get_或_create()进行大容量插入的有效方法_Python_Django_Bulkinsert - Fatal编程技术网

在Django(SQL、Python、Django)中使用get_或_create()进行大容量插入的有效方法

在Django(SQL、Python、Django)中使用get_或_create()进行大容量插入的有效方法,python,django,bulkinsert,Python,Django,Bulkinsert,有没有更有效的方法 for item in item_list: e, new = Entry.objects.get_or_create( field1 = item.field1, field2 = item.field2, ) 这取决于你的目标。您可以使用manage.py的函数以适当的格式(JSON、XML、YAML等)加载数据 另请参见。我想没有 但是我想知道你的项目是什么类型的,如果它们有field1和field2作为属性。似乎存在另

有没有更有效的方法

for item in item_list:
    e, new = Entry.objects.get_or_create(
        field1 = item.field1,
        field2 = item.field2,
    )

这取决于你的目标。您可以使用
manage.py
的函数以适当的格式(JSON、XML、YAML等)加载数据

另请参见。

我想没有


但是我想知道你的
项目是什么类型的,如果它们有
field1
field2
作为属性。似乎存在另一个表示条目的类,但该类不是从
模型派生的。Model
。也许您可以省略这个类并立即创建
Entry
实例,而不是创建那些项

如果您不确定数据库中是否已经存在
项目列表中的内容,并且需要模型对象,那么
获取或创建
无疑是一种方法

如果您知道这些项目不在数据库中,则最好执行以下操作:

for item in item_list:
    new = Entry.objects.create(
        field1 = item.field1,
        field2 = item.field2,
    )
如果不需要这些对象,则忽略函数调用的返回。它不会加快数据库的速度,但如果这是一个问题,它将有助于内存管理


如果您不确定数据是否已经在数据库中,但任一字段上都有一个
unique=True
标志,那么数据库将强制执行唯一性,您可以捕获异常并继续。这将通过避免选择现有对象的尝试来防止额外的DB命中

from django.db import IntegrityError

for item in item_list:
    try:
        new = Entry.objects.create(
            field1 = item.field1,
            field2 = item.field2,
        )
    except IntegrityError:
        continue

在这两种情况下,您都可以通过手动管理事务来提高速度。Django将为每次保存自动创建和提交事务,但如果您知道在特定函数中要进行大量的DB保存,则提供一些装饰程序将大大提高效率。Django文档在解释所有这些方面比我在这里做得更好,但您可能需要特别注意

您无法使用get_或_create(甚至create)进行适当的批量插入,而且没有API可以轻松完成这项工作

如果您的表足够简单,使用原始SQL创建行不会太麻烦,那么也不会太难;比如:

INSERT INTO site_entry (field1, field2)
(
         SELECT i.field1, i.field2
         FROM (VALUES %s) AS i(field1, field2)
         LEFT JOIN site_entry as existing
                 ON (existing.field1 = i.field1 AND existing.field2 = i.field2)
         WHERE existing.id IS NULL
)

其中%s是一个类似于
(“field1,field2”)、(“field3,field4”)、(“field5,field6”)
的字符串,您必须自己正确创建并转义该字符串。

自1.4以来,您可以进行批量创建


*不过请注意注意注意事项(最重要的是不会调用模型的save()方法,因此不会发送pre_save和post_save信号。)*

我的项目列表中的项目可能已经存在于我的数据库中,是的,我需要模型对象。而且没有一个字段有唯一的=True约束:'(因此我认为get_或_create是一种方法。让我们访问数据库!这并不能回答问题。首先,他说他想批量插入;“get_或_create是一种方法”没有帮助,因为get_或_create不执行批量插入。批量插入时,一次插入一个项目是错误的。最后,您不能只导致错误,然后忽略它;在Postgresql中,除非您跳过检查点环,否则将出现“事务中止”错误。按照我的方式,您可以批量插入多个(数百个)项目单个查询中的行数,这是您通常希望进行批量插入的方式。是的,但我不能使用MySQL。似乎我无法在您建议的查询中找到正确的SQL语法。get如何?在运行此查询时,您将如何接收模型对象?这可以通过新的批量插入来完成吗?这可能很有帮助,在一个实例中t、 你说你需要模型。你还说你使用了ExecuteMy。你是如何在使用ExecuteMy时得到模型的?这是一个断开的链接