#27797: dumpdata generate a backup not usable with loaddata using MySQL
-------------------------------------+-------------------------------------
               Reporter:  David      |          Owner:  nobody
  CHANIAL                            |
                   Type:             |         Status:  new
  Uncategorized                      |
              Component:  Core       |        Version:  1.9
  (Management commands)              |
               Severity:  Normal     |       Keywords:
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 == Introduction

 Hi !

 ----

 I have two problem :

 * The first one is that django produce me a record using DateTimeField
 with a value of "0000-00-00 00:00:00.000000", i '''never''' update
 database content without using django orm api. For this ticket, i tried 2
 hours to reproduce this problem, but i haven't. But i think that is there
 a different bug than the second one :

 * The second one, which permit me to discover the first one, is that
 dumpdata does not raise an error when dumping this kind of record. So,
 when using loaddata later, an error happend, failing to restore this
 record.

 ----

 I'm using a MySQL database with server : 10.1.21-MariaDB and Django-1.9.12
 During my tests, it's seems (unconfirmed) that SQLite has not the same
 behavior.


 == The bug

 * As said previously, no matter how the record in the database is weird or
 invalid, i think django MUST fail during '''dumpdata''' and not during
 '''loaddata''' when django can detect (as here) that produced data are not
 loadable.


 == Reproduce the bug

 * In an existing MySQL Django project named - for example - ''bobb'' :

 {{{
 cd bobb
 python manage.py startapp campanella
 echo 'INSTALLED_APPS = list(INSTALLED_APPS) + ["campanella"]' >>
 bobb/settings.py
 export DJANGO_SETTINGS_MODULE=bobb.settings
 }}}
 {{{
 cat >campanella/models.py  <<'EOF'
 from __future__ import unicode_literals
 from django.db import models

 class Interpretation(models.Model):
     player = models.CharField(max_length=200)
     inserted_on = models.DateTimeField(auto_now_add=True)
 EOF
 }}}
 {{{
 python manage.py makemigrations campanella
 python manage.py migrate campanella
 }}}
 {{{
 mysql -udev_mybb -p -S/var/lib/mysql/mysql.sock db_dev_mybb -e 'INSERT
 INTO campanella_interpretation (player, inserted_on) VALUES ("Lang Lang",
 "0000-00-00 00:00:00.000000");'
 }}}
 {{{
 python manage.py dumpdata campanella.interpretation --indent 4 > db.json
 }}}
 {{{
 cat db.json
 [
 {
     "model": "campanella.interpretation",
     "pk": 1,
     "fields": {
         "player": "Lang Lang",
         "inserted_on": null
     }
 }
 ]
 }}}
 {{{
 python -c 'import django;django.setup();from campanella.models import
 Interpretation; Interpretation.objects.all().delete()'
 }}}
 {{{
 python manage.py loaddata db.json
 Traceback (most recent call last):
   File "manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 353, in
 execute_from_command_line
     utility.execute()
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 345, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/management/base.py", line 348, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/management/base.py", line 399, in execute
     output = self.handle(*args, **options)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/management/commands/loaddata.py", line 60, in handle
     self.loaddata(fixture_labels)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/management/commands/loaddata.py", line 100, in
 loaddata
     self.load_label(fixture_label)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/management/commands/loaddata.py", line 158, in
 load_label
     obj.save(using=self.using)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/core/serializers/base.py", line 201, in save
     models.Model.save_base(self.object, using=using, raw=True, **kwargs)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/models/base.py", line 736, in save_base
     updated = self._save_table(raw, cls, force_insert, force_update,
 using, update_fields)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/models/base.py", line 820, in _save_table
     result = self._do_insert(cls._base_manager, using, fields, update_pk,
 raw)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/models/base.py", line 859, in _do_insert
     using=using, raw=raw)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/models/manager.py", line 122, in manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/models/query.py", line 1039, in _insert
     return query.get_compiler(using=using).execute_sql(return_id)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/models/sql/compiler.py", line 1060, in execute_sql
     cursor.execute(sql, params)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 79, in execute
     return super(CursorDebugWrapper, self).execute(sql, params)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/backends/mysql/base.py", line 117, in execute
     six.reraise(utils.IntegrityError,
 utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/django/db/backends/mysql/base.py", line 112, in execute
     return self.cursor.execute(query, args)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/MySQLdb/cursors.py", line 205, in execute
     self.errorhandler(self, exc, value)
   File "/home/dev_mybb/virtualenv/lib/python2.7/site-
 packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
     raise errorclass, errorvalue
 django.db.utils.IntegrityError: Problem installing fixture
 '/home/dev_mybb/bobb/db.json': Could not load
 campanella.Interpretation(pk=1): (1048, "Column 'inserted_on' cannot be
 null")
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/27797>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.5c2207924a01488a110c2a971fc1b9ea%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to