3

Прежде всего, я недавно обновился с Django 1.6 до 1.8 и никогда не использовал Юг, поэтому я новичок в миграции.Django: «Неизвестная колонна» при запуске makemigrations в приложении после добавления поля Integer

Я просто побежал:

> python manage.py makemigrations myapp 
> python manage.py migrate --fake initial 

создать начальные миграции для моей модели с существующими таблицами MySQL. Пока все было хорошо.

Затем я добавил IntegerField к моей модели:

new_integer_field = models.IntegerField(default = 50) #can include blank=True, null=True; seems to make no difference 

Теперь, когда я бегу:

>python manage.py makemigrations myapp 

Я получаю

django.db.utils.OperationalError: (1054, "Unknown column 'myapp_mymodel.new_integer_field' in 'field list'") 

обратное прослеживание (начиная где возникла проблема) это:

Traceback (most recent call last): 
    File "./manage.py", line 10, in <module> 
     execute_from_command_line(sys.argv) 
    File ".../django/core/management/__init__.py", line 338, in execute_from_command_line 
     utility.execute() 
    File ".../django/core/management/__init__.py", line 312, in execute 
     django.setup() 
    File ".../django/__init__.py", line 18, in setup 
     apps.populate(settings.INSTALLED_APPS) 
    File ".../django/apps/registry.py", line 115, in populate 
     app_config.ready() 
    File ".../autocomplete_light/apps.py", line 9, in ready 
     autodiscover() 
    File ".../autocomplete_light/registry.py", line 298, in autodiscover 
     autodiscover_modules('autocomplete_light_registry') 
    File ".../django/utils/module_loading.py", line 74, in autodiscover_modules 
     import_module('%s.%s' % (app_config.name, module_to_search)) 
    File ".../python2.7/importlib/__init__.py", line 37, in import_module 
     __import__(name) 
    File ".../mymapp/autocomplete_light_registry.py", line 42, in <module> 
     x = other_model.other_model_manager.manager_function(), 
    File ".../myapp/models.py", line 759, in get_a_queryset 
     stus = a_queryset 
    File ".../myapp/models.py", line 92, in get_another_queryset 
     if obj.model_function(prog): 
    File ".../myapp/models.py", line 402, in model_function 
     z = object.MyManagerObjects.manager_function(self) 
    File ".../myapp/models.py", line 573, in get_type 
     curstart = mymodel.MyManagerObjects.get().old_field 
    File ".../python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method 
     return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File ".../python2.7/site-packages/django/db/models/query.py", line 328, in get 
     num = len(clone) 
    File ".../python2.7/site-packages/django/db/models/query.py", line 144, in __len__ 
     self._fetch_all() 
    File ".../python2.7/site-packages/django/db/models/query.py", line 965, in _fetch_all 
     self._result_cache = list(self.iterator()) 
    File ".../python2.7/site-packages/django/db/models/query.py", line 238, in iterator 
     results = compiler.execute_sql() 
    File ".../python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql 
     cursor.execute(sql, params) 
    File ".../python2.7/site-packages/django/db/backends/utils.py", line 79, in execute 
     return super(CursorDebugWrapper, self).execute(sql, params) 
    File ".../python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
     return self.cursor.execute(sql, params) 
    File ".../python2.7/site-packages/django/db/utils.py", line 97, in __exit__ 
     six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File ".../python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
     return self.cursor.execute(sql, params) 
    File ".../python2.7/site-packages/django/db/backends/mysql/base.py", line 124, in execute 
     return self.cursor.execute(query, args) 
    File ".../python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute 
     self.errorhandler(self, exc, value) 
    File ".../python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
     raise errorclass, errorvalue 
django.db.utils.OperationalError: (1054, "Unknown column 'myapp_mymodel.new_integer_field' in 'field list'") 

MyManager проста, следующим образом:

class MyManager(models.Manager): 
    def get_queryset(self): 
     return super(MyManager, self).get_queryset().filter(...some filters...) #this is guaranteed to return a queryset with one object in it. 

А внутри MYAPP/models.py:

MyManagerObjects = MyManager() 

Итак, мой вопрос, почему я не могу добавить поле MyModel и запустить makemigrations? Что ломается в менеджере? Я запускаю stacktrace там, потому что я пробовал различные стратегии комментирования, которые, как представляется, указывают на этого менеджера, независимо от того, что были предыдущие вызовы.

Я уверен, что кто-то может сказать мне, что это что-то быстрое и простое, что я просто не вижу, но я не уверен, как это будет так! У кого-нибудь еще была эта проблема или есть какие-то предложения?

---- **** ---- Обновление 1: ошибка возникает не только с makemigrations - так как некоторые комментаторы спрашивали, что происходит, когда я запускаю python manage.py migrate Я думал, что попробую это для вещей и хихикает, хотя мигрировать нечего. Я ожидал, что мне будет сказано, что мигрировать нечем, но у меня такая же ошибка. Так что это не сам код макетирования; это то, что не может функционировать, потому что оно не может найти новое поле. Как-то он смотрит на модель и находит поле, которое он не распознает. Но почему?!

---- **** ---- Обновление 2: Я добавил начало трассировки ... Я не хочу публиковать какие-либо фактические имена путей/моделей, следовательно, изменения. Надеюсь, все в порядке. Заметка - это, насколько мне известно, не относится к autocomplete_light (если это не так!), Потому что, когда я прокомментирую строку x = other_model.other_model_manager.manager_function() (строка 42 в autocomplete_light_registry.py), ошибка возникает без ссылки на autocomplete_light. Я добавил вторую трассировку здесь, если это тоже помогает!

Traceback (most recent call last): 
    File "./manage.py", line 10, in <module> 
     execute_from_command_line(sys.argv) 
    File ".../django/core/management/__init__.py", line 338, in execute_from_command_line 
     utility.execute() 
    File ".../django/core/management/__init__.py", line 312, in execute 
     django.setup() 
    File ".../django/__init__.py", line 18, in setup 
     apps.populate(settings.INSTALLED_APPS) 
    File ".../django/apps/registry.py", line 115, in populate 
     app_config.ready() 
    File ".../django/contrib/admin/apps.py", line 22, in ready 
     self.module.autodiscover() 
    File ".../django/contrib/admin/__init__.py", line 24, in autodiscover 
     autodiscover_modules('admin', register_to=site) 
    File ".../django/utils/module_loading.py", line 74, in autodiscover_modules 
     import_module('%s.%s' % (app_config.name, module_to_search)) 
    File ".../python2.7/importlib/__init__.py", line 37, in import_module 
     __import__(name) 
    File ".../myapp/admin.py", line 151, in <module> 
     class MyListFilter(SimpleListFilterWithDefault): 
    File ".../myapp/admin.py", line 154, in MyListFilter 
     x = mymodel.MyManagerObjects.get() 
    File ".../django/db/models/manager.py", line 127, in manager_method 
     return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File ".../django/db/models/query.py", line 328, in get 
     num = len(clone) 
    File ".../django/db/models/query.py", line 144, in __len__ 
     self._fetch_all() 
    File ".../django/db/models/query.py", line 965, in _fetch_all 
     self._result_cache = list(self.iterator()) 
    File ".../django/db/models/query.py", line 238, in iterator 
     results = compiler.execute_sql() 
    File ".../django/db/models/sql/compiler.py", line 840, in execute_sql 
     cursor.execute(sql, params) 
    File ".../django/db/backends/utils.py", line 79, in execute 
     return super(CursorDebugWrapper, self).execute(sql, params) 
    File ".../django/db/backends/utils.py", line 64, in execute 
     return self.cursor.execute(sql, params) 
    File ".../django/db/utils.py", line 97, in __exit__ 
     six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File ".../django/db/backends/utils.py", line 64, in execute 
     return self.cursor.execute(sql, params) 
    File ".../django/db/backends/mysql/base.py", line 124, in execute 
     return self.cursor.execute(query, args) 
    File ".../MySQLdb/cursors.py", line 205, in execute 
     self.errorhandler(self, exc, value) 
    File ".../MySQLdb/connections.py", line 36, in defaulterrorhandler 
     raise errorclass, errorvalue 
django.db.utils.OperationalError: (1054, "Unknown column 'myapp_mymodel.new_integer_field' in 'field list'") 
+0

вы запустить Перенести после запускали makemigrations во второй раз? – karthikr

+0

@ karthikr Я не могу; ошибка возникает, когда я запускаю 'python manage.py makemigrations myapp', поэтому миграция нечем. – jenniwren

+0

Вся трассировка также поможет определить стадию инициализации приложения, когда он не работает. – Fush

ответ

5

Похоже, что вы делаете запрос дб либо когда ваш модуль импортируется или когда приложение регистрируется: curstart = mymodel.MyManagerObjects.get().old_field

Это означает, что при выполнении любой команды управления, как runserver, makemigrations или migrate, если вы «Я изменил ваши модели, тогда они будут не синхронизированы с вашей базой данных, и запрос будет вызывать исключение, прежде чем команда сможет сделать то, что она должна (например, сделать ваши миграции).

Если возможно, измените код, так что MyManagerObjects.get() не вызывается во время загрузки, например, с помощью лямбда-функции или обертывания его в методе, который вы можете вызвать во время выполнения.

Если это невозможно, вам нужно будет прокомментировать этот раздел кода каждый раз, когда вы делаете или выполняете миграцию, но это действительно грязно.

Update: В полной TRACEBACK есть линия:

File ".../myapp/admin.py", line 154, in MyListFilter 
    x = mymodel.MyManagerObjects.get() 

что означает get бежится, когда файл администратора импортируется. Я думаю, вам может понадобиться поставить вызов mymodel.MyManagerObjects.get() в MyListFilter.queryset() вместо объявления класса.

https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

+0

Я попробовал лямбда-функцию, которую я никогда не использовал раньше, поэтому я хочу изучить предложения дальше. Странно, правда, что трассировка не указывает на менеджера? Почему это заканчивается в запросе с помощью менеджера, а не внутри самого менеджера? – jenniwren

+0

Итак, теперь я попытался создать лямбда внутри менеджера (без изменений) и создать лямбда в месте, где происходит ошибка. Последний вызывает ошибку при лямбда-функции. Имеет ли смысл следующее? 'curstart = lambda: mymodel.MyManagerObjects.get(). old_field' then' curstart = curstart() 'Если это так, не удастся, ошибка все еще происходит на линии лямбда. Интересно, как обстоит дело с кодом 'objects' django? – jenniwren

+0

Обновление было очень полезно - оно решило эту версию проблемы. Первая трассировка все еще происходит, и неясно, как ее исправить в автозаполнении. Проблема заключается в установке «выборов» при регистрации автозаполнения. Использование лямбда не помогло; похоже, теперь это, возможно, новый связанный с этим вопрос, связанный с автозаполнением света. По крайней мере, сейчас я понимаю это немного лучше. Благодаря! – jenniwren

0

Это не должно быть:

python manage.py makemigrations mymodel 

должно быть:

python manage.py makemigrations myapp 

Так закомментировать new_integer_field и сделать это снова, я думаю.

Вам также необходимо запустить migrate, чтобы добавить столбец new_integer_field в таблицу базы данных.

python manage.py makemigrations myapp 
./manage.py migrate --fake 
# add new_integer_field 
./manage.py makemigrations myapp 
./manage.py migrate 
+0

Извините, я запускал 'python manage.py makemigrations myapp' оба раза. Исправлено выше. – jenniwren

+0

Да, хорошо, но мой второй комментарий исправил вашу проблему? –

+0

Вы говорите о том, где вы говорите, чтобы запускать makemigrations, а затем мигрировать? Я не могу делать ничего из этого. makemigrations не работает, поэтому миграции нечего. Кроме того, миграция вызывает ту же ошибку. Я получаю шаг 3 в вашем «втором комментарии» и получаю сообщение об ошибке. Если это не то, что вы имеете в виду, тогда мне нужно разъяснение. То, что вы предложили, - это именно то, что я пытался сделать (кроме моего понимания, что это '--fake-initial', а не' --fake'. – jenniwren

-1

Проблема в том, что вы создали и сохранили миграцию, но не применили их к базе данных. Вам просто нужно сделать следующее:

python manage.py makemigrations 
python manage.py migrate 

Это должно решить вашу проблему.

+0

Опять же, как и в случае с комментарием @ karthikr выше, бег migrate не имеет ничего общего, потому что makemigrations не работает. – jenniwren

 Смежные вопросы

  • Нет связанных вопросов^_^