#26789: ORM produces query with NULL instead of empty geometry
-------------------------------+--------------------
     Reporter:  sir-sigurd     |      Owner:  nobody
         Type:  Uncategorized  |     Status:  new
    Component:  Uncategorized  |    Version:  1.9
     Severity:  Normal         |   Keywords:
 Triage Stage:  Unreviewed     |  Has patch:  0
Easy pickings:  0              |      UI/UX:  0
-------------------------------+--------------------
 {{{#!python
 from test_app.models import City
 from django.contrib.gis.geos.geometry import GEOSGeometry

 City.objects.create(point=GEOSGeometry('POINT EMPTY', srid=4326))
 }}}
 raises error
 {{{#!python
 /home/sergey/dev/django/django/db/models/manager.pyc in
 manager_method(self, *args, **kwargs)
      83         def create_method(name, method):
      84             def manager_method(self, *args, **kwargs):
 ---> 85                 return getattr(self.get_queryset(), name)(*args,
 **kwargs)
      86             manager_method.__name__ = method.__name__
      87             manager_method.__doc__ = method.__doc__

 /home/sergey/dev/django/django/db/models/query.pyc in create(self,
 **kwargs)
     397         obj = self.model(**kwargs)
     398         self._for_write = True
 --> 399         obj.save(force_insert=True, using=self.db)
     400         return obj
     401

 /home/sergey/dev/django/django/db/models/base.pyc in save(self,
 force_insert, force_update, using, update_fields)
     794
     795         self.save_base(using=using, force_insert=force_insert,
 --> 796                        force_update=force_update,
 update_fields=update_fields)
     797     save.alters_data = True
     798

 /home/sergey/dev/django/django/db/models/base.pyc in save_base(self, raw,
 force_insert, force_update, using, update_fields)
     822             if not raw:
     823                 self._save_parents(cls, using, update_fields)
 --> 824             updated = self._save_table(raw, cls, force_insert,
 force_update, using, update_fields)
     825         # Store the database on which the object was saved
     826         self._state.db = using

 /home/sergey/dev/django/django/db/models/base.pyc in _save_table(self,
 raw, cls, force_insert, force_update, using, update_fields)
     906
     907             update_pk = bool(meta.has_auto_field and not pk_set)
 --> 908             result = self._do_insert(cls._base_manager, using,
 fields, update_pk, raw)
     909             if update_pk:
     910                 setattr(self, meta.pk.attname, result)

 /home/sergey/dev/django/django/db/models/base.pyc in _do_insert(self,
 manager, using, fields, update_pk, raw)
     945         """
     946         return manager._insert([self], fields=fields,
 return_id=update_pk,
 --> 947                                using=using, raw=raw)
     948
     949     def delete(self, using=None, keep_parents=False):

 /home/sergey/dev/django/django/db/models/manager.pyc in
 manager_method(self, *args, **kwargs)
      83         def create_method(name, method):
      84             def manager_method(self, *args, **kwargs):
 ---> 85                 return getattr(self.get_queryset(), name)(*args,
 **kwargs)
      86             manager_method.__name__ = method.__name__
      87             manager_method.__doc__ = method.__doc__

 /home/sergey/dev/django/django/db/models/query.pyc in _insert(self, objs,
 fields, return_id, raw, using)
    1042         query = sql.InsertQuery(self.model)
    1043         query.insert_values(fields, objs, raw=raw)
 -> 1044         return
 query.get_compiler(using=using).execute_sql(return_id)
    1045     _insert.alters_data = True
    1046     _insert.queryset_only = False

 /home/sergey/dev/django/django/db/models/sql/compiler.pyc in
 execute_sql(self, return_id)
    1052         with self.connection.cursor() as cursor:
    1053             for sql, params in self.as_sql():
 -> 1054                 cursor.execute(sql, params)
    1055             if not (return_id and cursor):
    1056                 return

 /home/sergey/dev/django/django/db/backends/utils.pyc in execute(self, sql,
 params)
      77         start = time()
      78         try:
 ---> 79             return super(CursorDebugWrapper, self).execute(sql,
 params)
      80         finally:
      81             stop = time()

 /home/sergey/dev/django/django/db/backends/utils.pyc in execute(self, sql,
 params)
      62                 return self.cursor.execute(sql)
      63             else:
 ---> 64                 return self.cursor.execute(sql, params)
      65
      66     def executemany(self, sql, param_list):

 /home/sergey/dev/django/django/db/utils.pyc in __exit__(self, exc_type,
 exc_value, traceback)
      92                 if dj_exc_type not in (DataError, IntegrityError):
      93                     self.wrapper.errors_occurred = True
 ---> 94                 six.reraise(dj_exc_type, dj_exc_value, traceback)
      95
      96     def __call__(self, func):

 /home/sergey/dev/django/django/db/backends/utils.pyc in execute(self, sql,
 params)
      62                 return self.cursor.execute(sql)
      63             else:
 ---> 64                 return self.cursor.execute(sql, params)
      65
      66     def executemany(self, sql, param_list):

 IntegrityError: ОШИБКА:  нулевое значение в столбце "point" нарушает
 ограничение NOT NULL
 DETAIL:  Ошибочная строка содержит (3, null).
 }}}

 The last query
 {{{#!python
 from django.db import connection
 connection.queries[-1]['sql']
 }}}
 is
 {{{#!python
 u'INSERT INTO "test_app_city" ("point") VALUES (NULL) RETURNING
 "test_app_city"."id"'
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/26789>
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/053.4a1c7f326d0d8494f94bc6e4cbca1134%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to