Skip to content

Running django migrate fails when exists table constraint has more than one column referenced #109

@trebor74hr

Description

@trebor74hr

Django version is: 5.0.11
ibm_db_django version is 1.5.3.0

Running migration for django.contrib.auth application (0010, e.g.: django-admin.py migrate auth 0010) I get error:

Traceback (most recent call last):
  File "/srv/itzz/python/itzz/manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
    utility.execute()
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/core/management/__init__.py", line 436, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/core/management/base.py", line 413, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/core/management/commands/sqlmigrate.py", line 38, in execute
    return super().execute(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/core/management/base.py", line 459, in execute
    output = self.handle(*args, **options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/core/management/commands/sqlmigrate.py", line 80, in handle
    sql_statements = loader.collect_sql(plan)
                     ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/db/migrations/loader.py", line 381, in collect_sql
    state = migration.apply(state, schema_editor, collect_sql=True)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/db/migrations/migration.py", line 132, in apply
    operation.database_forwards(
  File "/srv/pyenv311/lib64/python3.11/site-packages/django/db/migrations/operations/fields.py", line 235, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/srv/pyenv311/lib64/python3.11/site-packages/ibm_db_django/schemaEditor.py", line 288, in alter_field
    self._alter_field(model, old_field, new_field, old_type, new_type,
  File "/srv/pyenv311/lib64/python3.11/site-packages/ibm_db_django/schemaEditor.py", line 438, in _alter_field
    fk_constraints = self._is_referenced_by_fk_constraint(model._meta.db_table, old_field.column, ignore_self=True)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/pyenv311/lib64/python3.11/site-packages/ibm_db_django/schemaEditor.py", line 237, in _is_referenced_by_fk_constraint
    constraint_table, constraint_column = constraint['foreign_key']
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: too many values to unpack (expected 2)

Inspecting constraint data in the point of failure I get:

constraint['foreign_key'] := ('explain_operator', 'explain_requester', 'explain_time', 'source_name', 'source_schema', 'source_version', 'explain_level', 'stmtno', 'sectno', 'operator_id')

So, table name of constraint is explain_operator, and list of columns is [ 'explain_requester', 'explain_time', 'source_name', 'source_schema', 'source_version', 'explain_level', 'stmtno', 'sectno', 'operator_id].

Two issues:

  1. table explain_operator is standard db2 table used internally for EXPLAIN command. Such tables maybe should be be skipped when collecting, or better, only tables that needs migrate management should be analysed.
  2. constraint can have more than one columns in its definition (even django allows such cases, e.g. Index(), unique_together, ...), so logic should be fixed

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions