#22705 closed Bug (fixed)
can't bulk create models with no fields
Reported by: | Owned by: | Chris Luc | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.6 |
Severity: | Normal | Keywords: | QuerySet.bulk_create |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I have a model
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.
Attachments (1)
Change History (9)
comment:1 by , 10 years ago
Component: | Uncategorized → Database layer (models, ORM) |
---|---|
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
by , 10 years ago
Attachment: | 22705-test.diff added |
---|
comment:2 by , 10 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:3 by , 10 years ago
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
comment:4 by , 9 years ago
Keywords: | QuerySet.bulk_create added |
---|
comment:5 by , 9 years ago
Has patch: | set |
---|
Fixed in Django 1.9 by 134ca4d438bd7cbe8f0f287a00d545f96fa04a01.
PR to add a regression test.
Can reproduce with the attached test for Django's test suite.