#29097: Migrations using MySQL fail for constraints using composite indexes
-------------------------------------+-------------------------------------
Reporter: | Owner: nobody
geertjanvdk |
Type: Bug | Status: new
Component: Database | Version: 1.11
layer (models, ORM) | Keywords: introspection mysql
Severity: Normal | migration index constraint
Triage Stage: | Has patch: 1
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 1
UI/UX: 0 |
-------------------------------------+-------------------------------------
When running migrations which create (unique) composite indexes, the MySQL
introspection fails to get the correct index:
ValueError: Found wrong number (0) of constraints for
product_versions(product_id, ordering)
This was previously reported as fixed (see
https://code.djangoproject.com/ticket/28697), but it is not. Using 1.11.5,
and 1.11.9, it fails.
The fix is very easy: in DatabaseIntrospection.get_constraints(), an ORDER
BY is missing when selecting from the table
INFOMRATION_SCHEMA.KEY_COLUMN_USAGE:
Thus:
{{{
def get_constraints(self, cursor, table_name):
"""
Retrieves any constraints or keys (unique, pk, fk, check, index)
across one or more columns.
"""
constraints = {}
# Get the actual constraint names and columns
name_query = """
SELECT kc.`constraint_name`, kc.`column_name`,
kc.`referenced_table_name`, kc.`referenced_column_name`
FROM information_schema.key_column_usage AS kc
WHERE
kc.table_schema = DATABASE() AND
kc.table_name = %s
ORDER BY kc.`constraint_name`, kc.`ordinal_position`
"""
....
}}}
The ORDER BY assures the order the columns were specified. the SHOW INDEX
statement does this by default.
The above should work for all MySQL versions supported.
Note that Django 2.0 has the same issue.
Patch available
https://github.com/geertjanvdk/django/commit/ab0bcb327c51aab71f58789eb55a7981dcb06fdb
--
Ticket URL: <https://code.djangoproject.com/ticket/29097>
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/054.e8833e3cf4c0640a74c63cc2b7ea9bf6%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.