Ошибка Django: столбец не существует, но я не могу контролировать эту таблицу?

#python #django #postgresql

Вопрос:

Я внес несколько изменений в код, но ничего такого, что изменило бы модель или добавило что-то новое в базу данных. Когда я запускаю на своем компьютере, он работает нормально, но когда я пытаюсь создать образ докера и запустить его, он выдает эту ошибку:

 Traceback (most recent call last):
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 82, in _execute
    return self.cursor.execute(sql)
psycopg2.errors.UndefinedColumn: column c.relispartition does not exist
LINE 3:             CASE WHEN c.relispartition THEN 'p' WHEN c.relki...
                              ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/app/manage.py", line 35, in <module>
    main()
  File "/app/manage.py", line 31, in main
    execute_from_command_line(sys.argv)
  File "/home/go/.local/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/go/.local/lib/python3.9/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/go/.local/lib/python3.9/site-packages/django/core/management/base.py", line 373, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/go/.local/lib/python3.9/site-packages/django/core/management/base.py", line 417, in execute
    output = self.handle(*args, **options)
  File "/home/go/.local/lib/python3.9/site-packages/django/core/management/base.py", line 90, in wrapped
    res = handle_func(*args, **kwargs)
  File "/home/go/.local/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 92, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/migrations/loader.py", line 53, in __init__
    self.build_graph()
  File "/home/go/.local/lib/python3.9/site-packages/django/db/migrations/loader.py", line 223, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/home/go/.local/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
    if self.has_table():
  File "/home/go/.local/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 56, in has_table
    tables = self.connection.introspection.table_names(cursor)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/base/introspection.py", line 52, in table_names
    return get_names(cursor)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/base/introspection.py", line 47, in get_names
    return sorted(ti.name for ti in self.get_table_list(cursor)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/postgresql/introspection.py", line 49, in get_table_list
    cursor.execute("""
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 98, in execute
    return super().execute(sql, params)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/go/.local/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/go/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 82, in _execute
    return self.cursor.execute(sql)
django.db.utils.ProgrammingError: column c.relispartition does not exist
LINE 3:             CASE WHEN c.relispartition THEN 'p' WHEN c.relki...
                              ^
 

Для меня это странно, потому что я не могу контролировать, что делает эта таблица.
Когда я бегу makemigrations , и migrate он говорит мне, что ничего не изменилось.

Если я запускаю образ докера в локальной базе данных postgres, он работает, и такой ошибки нет, эта ошибка происходит в производственной базе данных.

Я пробовал решения аналогичных проблем здесь, на stackoverflow, но ничего не получалось. Похоже, единственное решение-создать новую базу данных…

Комментарии:

1. Какие версии Postgres являются локальными и производственными экземплярами? Столбец relispartition не существует до Postgres 10.

2. Локальная версия 14, в то время как производственная версия 9.6, вот и все, большое вам спасибо! Знаете ли вы, почему эта проблема возникла только сейчас? @AdrianKlaver

3. Это исходит из django/db/backends/utils.py того, что вы недавно обновили Django?

4. Это все исправило! При создании конвейера обработки изображений я захватил новую версию Django, я ограничил ее 3.2.7, и это сработало. Спасибо

5. Какая версия вызвала проблему? Из примечаний к выпуску следует, что версии 3.2.x должны поддерживать Postgres 9.6 . Если это не так, вам, вероятно, следует подать заявление о проблемах здесь.