Commit 80ad5472 authored by Andriy Sokolovskiy's avatar Andriy Sokolovskiy Committed by Tim Graham
Browse files

Fixed #24817 -- Prevented loss of null info in MySQL field renaming.

parent 300e8baf
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -542,12 +542,7 @@ class BaseDatabaseSchemaEditor(object):
                self.execute(self._delete_constraint_sql(self.sql_delete_check, model, constraint_name))
        # Have they renamed the column?
        if old_field.column != new_field.column:
            self.execute(self.sql_rename_column % {
                "table": self.quote_name(model._meta.db_table),
                "old_column": self.quote_name(old_field.column),
                "new_column": self.quote_name(new_field.column),
                "type": new_type,
            })
            self.execute(self._rename_field_sql(model._meta.db_table, old_field, new_field, new_type))
        # Next, start accumulating actions to do
        actions = []
        null_actions = []
@@ -864,6 +859,14 @@ class BaseDatabaseSchemaEditor(object):
            output.append(self._create_index_sql(model, fields, suffix="_idx"))
        return output

    def _rename_field_sql(self, table, old_field, new_field, new_type):
        return self.sql_rename_column % {
            "table": self.quote_name(table),
            "old_column": self.quote_name(old_field.column),
            "new_column": self.quote_name(new_field.column),
            "type": new_type,
        }

    def _create_fk_sql(self, model, field, suffix):
        from_table = model._meta.db_table
        from_column = field.column
+14 −3
Original line number Diff line number Diff line
@@ -80,10 +80,21 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
                )
        return super(DatabaseSchemaEditor, self)._delete_composed_index(model, fields, *args)

    def _alter_column_type_sql(self, table, old_field, new_field, new_type):
        # Keep null property of old field, if it has changed, it will be handled separately
        if old_field.null:
    def _set_field_new_type_null_status(self, field, new_type):
        """
        Keep the null property of the old field. If it has changed, it will be
        handled separately.
        """
        if field.null:
            new_type += " NULL"
        else:
            new_type += " NOT NULL"
        return new_type

    def _alter_column_type_sql(self, table, old_field, new_field, new_type):
        new_type = self._set_field_new_type_null_status(old_field, new_type)
        return super(DatabaseSchemaEditor, self)._alter_column_type_sql(table, old_field, new_field, new_type)

    def _rename_field_sql(self, table, old_field, new_field, new_type):
        new_type = self._set_field_new_type_null_status(old_field, new_type)
        return super(DatabaseSchemaEditor, self)._rename_field_sql(table, old_field, new_field, new_type)
+10 −0
Original line number Diff line number Diff line
==========================
Django 1.7.9 release notes
==========================

*Under development*

Django 1.7.9 fixes several bugs in 1.7.8.

* Prevented the loss of ``null``/``not null`` column properties during field
  renaming of MySQL databases (:ticket:`24817`).
+3 −0
Original line number Diff line number Diff line
@@ -25,3 +25,6 @@ Bugfixes

* Fixed a regression which caused template context processors to overwrite
  variables set on a ``RequestContext`` after it's created (:ticket:`24847`).

* Prevented the loss of ``null``/``not null`` column properties during field
  renaming of MySQL databases (:ticket:`24817`).
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ versions of the documentation contain the release notes for any later releases.
.. toctree::
   :maxdepth: 1

   1.7.9
   1.7.8
   1.7.7
   1.7.6
Loading