{{{
class Discussion(models.Model): pass
}}}
I try to do this:
{{{
discussions = [Discussion() for i in range(n)]
Discussion.objects.bulk_create(discussions)
}}}
it fails with
AttributeError: 'NoneType' object has no attribute 'column'
because
django.db.models.sql.compiler.SQLInsertCompiler.as_sql has the following
line in it:
{{{
fields = [None]
}}}
which doesn't get tripped on models that have fields, apparently.
--
Ticket URL: <https://code.djangoproject.com/ticket/22705>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* component: Uncategorized => Database layer (models, ORM)
* needs_tests: => 0
* needs_docs: => 0
* type: Uncategorized => Bug
* stage: Unreviewed => Accepted
Comment:
Can reproduce with the attached test for Django's test suite.
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:1>
* owner: nobody => chrisjluc
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:2>
Comment (by chrisjluc):
I've modified the compiler to create the below query, but I'm getting an
Integrity Error: datatype mismatch when I run it in Django. I assume it's
because `id` is a pk and it doesn't accept `NULL` values, but it seems to
work on my own sqlite. Does anyone know how to solve this issue?
We use the second form of bulk inserting, ref
https://www.sqlite.org/lang_insert.html
`u'INSERT INTO "bulk_create_nofields" ("id") SELECT %s UNION ALL SELECT %s
UNION ALL SELECT %s', (u'NULL', u'NULL', u'NULL'))`
{{{
Traceback (most recent call last):
File
"/Users/chrisjluc/Documents/opensource/django/tests/bulk_create/tests.py",
line 172, in test_empty_model
NoFields.objects.bulk_create(objs)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/models/manager.py",
line 127, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/models/query.py",
line 445, in bulk_create
self._batched_insert(objs_without_pk, fields, batch_size)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/models/query.py",
line 1043, in _batched_insert
using=self.db)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/models/manager.py",
line 127, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/models/query.py",
line 1026, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/models/sql/compiler.py",
line 974, in execute_sql
cursor.execute(sql, params)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/backends/utils.py",
line 64, in execute
return self.cursor.execute(sql, params)
File "/Users/chrisjluc/Documents/opensource/django/django/db/utils.py",
line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/backends/utils.py",
line 64, in execute
return self.cursor.execute(sql, params)
File
"/Users/chrisjluc/Documents/opensource/django/django/db/backends/sqlite3/base.py",
line 318, in execute
return Database.Cursor.execute(self, query, params)
IntegrityError: datatype mismatch
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:3>
* keywords: => QuerySet.bulk_create
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:4>
* has_patch: 0 => 1
Comment:
Fixed in Django 1.9 by 134ca4d438bd7cbe8f0f287a00d545f96fa04a01.
[https://github.com/django/django/pull/5415 PR] to add a regression test.
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:5>
* stage: Accepted => Ready for checkin
Comment:
Regression test LGTM.
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:6>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"7a5b7e35bf2e219225b9f26d3dd3e34f26e83e9c" 7a5b7e35]:
{{{
#!CommitTicketReference repository=""
revision="7a5b7e35bf2e219225b9f26d3dd3e34f26e83e9c"
Fixed #22705 -- Fixed QuerySet.bulk_create() on models without any fields
on Oracle.
Fixed on other backends by 134ca4d438bd7cbe8f0f287a00d545f96fa04a01.
Thanks Mariusz Felisiak for the solution.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:7>
Comment (by Tim Graham <timograham@…>):
In [changeset:"7cd299584dd9b152c736854c6558670e57512d40" 7cd2995]:
{{{
#!CommitTicketReference repository=""
revision="7cd299584dd9b152c736854c6558670e57512d40"
[1.9.x] Fixed #22705 -- Fixed QuerySet.bulk_create() on models without any
fields on Oracle.
Fixed on other backends by 134ca4d438bd7cbe8f0f287a00d545f96fa04a01.
Thanks Mariusz Felisiak for the solution.
Backport of 7a5b7e35bf2e219225b9f26d3dd3e34f26e83e9c from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/22705#comment:8>