2016-03-17 2 views
1

среды DJANGO версии 1.9 Python 2.7.6«нет такого столбца» после добавления поля в модель

Я добавил поле (баллы) в класс модели в models.py как этот

from django.db import models 
from django.contrib.auth.models import User 
import urllib 
import hashlib 


class profile(models.Model): 
    user = models.OneToOneField(User) 
    nickname = models.CharField(max_length=12, blank=True, null=True) 
    use_gravatar = models.BooleanField(default=True) 
    location = models.CharField(max_length=20, blank=True, null=True) 
    avatar_url = models.URLField(blank=True, null=True) 
    website = models.URLField(blank=True, null=True) 
    **scores = models.IntegerField(default = 0)** 

, и я запускаю следующие команды для синхронизации базы данных.

python manage.py makemigrations 
python manage.py migrate 

Но получил эту

OperationalError at/
no such column: account_profile.scores 
Request Method: GET 
Request URL: http://127.0.0.1:8000/ 
Django Version: 1.8.4 
Exception Type: OperationalError 
Exception Value:  
no such column: account_profile.scores 
Exception Location: C:\Python27\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 318 
Python Executable: C:\Python27\python.exe 
Python Version: 2.7.5 
Python Path:  
['c:\\FairyBBS', 
'C:\\Users\\user\\AppData\\Roaming\\Python\\Python27\\site-packages\\setuptools-5.4.1-py2.7.egg', 
'C:\\Users\\user\\AppData\\Roaming\\Python\\Python27\\site-packages\\urlobject-2.4.0-py2.7.egg', 
'C:\\Users\\user\\AppData\\Roaming\\Python\\Python27\\site-packages\\djangorestframework-0.4.0-py2.7.egg', 
'C:\\WINDOWS\\SYSTEM32\\python27.zip', 
'C:\\Python27\\DLLs', 
'C:\\Python27\\lib', 
'C:\\Python27\\lib\\plat-win', 
'C:\\Python27\\lib\\lib-tk', 
'C:\\Python27', 
'C:\\Users\\user\\AppData\\Roaming\\Python\\Python27\\site-packages', 
'C:\\Python27\\lib\\site-packages'] 
Server time: 星期四, 17 三月 2016 14:08:04 +0800 

ответ

9

Быстрая фиксация.

Первое поля удалить scores, то

python manage.py makemigrations 
python manage.py migrate 

Если какая-либо ошибка происходит

python manage.py migrate --fake 

Тогда Добавить поле scores .Застет

python manage.py makemigrations 
python manage.py migrate 

Надеется, что это помогает.

+1

«Если какая-либо ошибка происходит» // но нет ошибок. и я пробовал команды else, но он все равно не работает. – ming

+0

Вы пытались удалить и добавить поля, как описано выше? – itzMEonTV

+0

да я удалить его 'λ питона manage.py makemigrations счета Миграции для 'счета': 0004_remove_profile_scores.py: - Удалить полевые оценки от profile' и добавить его ' C: \ FairyBBS ​​ λ питон manage.py makemigrations счет Миграции для 'счетов': 0005_profile_scores.py: - Добавить поле забивает profile' еще 'OperationalError в/ нет такой колонки: account_profile.scores' – ming

0

Эти проблемы с переносом меня тоже беспокоят, когда мне нужно обновить мое приложение новыми столбцами, поэтому я сделал небольшой bash с некоторым python, чтобы найти неприятные столбцы, удалить их, перенести, повторно добавить и снова выполнить миграцию ,

Вот resolve.sh, что вызывает питон и миграции (должно быть помещено в той же папке, что и файл manage.py, как .py файлов):

python manage.py shell < check.py 

read -p "Does it seem ok ? (y for ok/n for remigrate)" migrateok 

if [ $migrateok = "n" ] 
then 
    python manage.py shell < rm_badcolumns.py 

    python manage.py makemigrations 
    sleep 1 
    python manage.py migrate 

    python manage.py shell < resume_badcolumns.py 

    python manage.py makemigrations 
    sleep 1 
    python manage.py migrate 

    echo It should work now.. 
else 
    echo No changes were made.. 
fi 

check.py проверяет, есть ли проблемы с некоторыми моделями в базе данных:

from <app>.models import * 
import os, sys 
from shutil import move 
from django.db import connection 

tables = connection.introspection.table_names() 
seen_models = connection.introspection.installed_models(tables) 

errorColumn = [] 
is_fine = "EVERYTHING LOOKS FINE!" 
#looping through models to detect issues 
for model in seen_models: 
    try: 
     print(model.objects.all()) 
    except: 
     is_fine = "WARNING SOME MODELS ARE CORRUPTED" 

print(is_fine) 

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

Если пользователь выбирает «повторно мигрирует», он называет rm_badcolumns.py:

from <app>.models import * 
import os, sys 
from shutil import move 
from django.db import connection 


tables = connection.introspection.table_names() 
seen_models = connection.introspection.installed_models(tables) 

errorColumn = [] 

for model in seen_models: 
    try: 
     model.objects.all() 
    except: 
     errorColumn.append(str(sys.exc_info()[1])[30::]+' =') 
     #this weird expression just get the column that causes trouble 
     #you may have to adapt indexes depending on error output in exc_info 

os.chdir('./<app>/') 

#removing columns from models.py based on the error pattern 
def replace(pattern, subst): 
    with open('models_sub.py','w') as fout: 
     with open('models.py','r') as models: 
      for line in models: 
       fout.write(line.replace(pattern, subst)) 

    os.remove('models.py') 
    move('models_sub.py','models.py') 

#applying this func to each error, and commenting out columns with an error mark to catch them back later 
for errorStr in errorColumn: 
    replace(errorStr, '#error_mark '+errorStr) 

print 'Removing troublesome column for re-entering..' 

Затем resolve.sh начнет другую миграцию. Мы раскомментируйте хлопотно колонны с resume_badcolumns.py, чтобы заставить их снова мигрировали:

from <app>.models import * 
import os, sys 
from shutil import move 
from django.db import connection 


os.chdir('./<app>/') 

#same search and replace func but returning True if sthg was replaced, and False otherwise 
def replace(pattern, subst): 
    a = False 
    with open('models_sub.py','w') as fout: 
     with open('models.py','r') as models: 
      for line in models: 
       fout.write(line.replace(pattern, subst)) 
       if pattern in line: 
        a = True 
    os.remove('models.py') 
    move('models_sub.py','models.py') 

    return a 

a = True 
#while error_marks are replaced, we go on looping 
while a: 
    a = replace('#error_mark ', '') 

print 'Re-adding troublesome columns..' 

Мы делаем окончательный миграции и все должно быть хорошо.

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

2

Это может произойти, если вы ссылаетесь модель на корневом уровне вашего приложения

Это случилось со мной, когда я обновление приложения mapping_master. Я добавлял новое поле следующим образом:

class MappingMaster(models.Model): 

    ... 

    # New field that was being added 
    statement = models.CharField(max_length=20, choices=STATEMENT_CHOICES, default='PNL', blank=True, null=True) 

Дал мне следующий StackTrace:

D:\Adwaith\codebase\unitapp>python manage.py makemigrations 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 
338, in execute_from_command_line 
    utility.execute() 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 
312, in execute 
    django.setup() 

.... 
.... 

    File "C:\Python27\lib\site-packages\django\apps\config.py", line 198, in impor 
t_models 
    self.models_module = import_module(models_module_name) 
    File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module 
    __import__(name) 
    File "D:\Adwaith\codebase\unitapp\trial_balance_entry\models.py", line 5, in < 
module> 
    from unitapp import docclass 
    File "D:\Adwaith\codebase\unitapp\unitapp\docclass.py", line 139, in <module> 
    sample_train_type(type_classifier) 
    File "D:\Adwaith\codebase\unitapp\unitapp\docclass.py", line 6, in sample_trai 
n_type 
    for mapping in MappingMaster.objects.all(): 

.... 
.... 

    File "C:\Python27\lib\site-packages\django\db\backends\sqlite3\base.py", line 
318, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.OperationalError: no such column: mapping_master_mappingmaster.statement 

Оказывается, что моя проблема была в другом файле полностью. Это было в trial_balance_entry приложение:

... 
# The important line is below 
from unitapp import docclass 


class TrialBalanceEntry(models.Model): 
    ... 

А внутри docclass.py, у меня было:

import re, csv, os 
from mapping_master.models import MappingMaster 


def sample_train_type(cl): 
    for mapping in MappingMaster.objects.all(): 
     cl.train(mapping.entry, mapping.type) 


def sample_train_category(cl): 
    for mapping in MappingMaster.objects.all(): 
     cl.train(mapping.entry, mapping.category) 

... 

Оказывается, что экземпляры MappingMaster модели были ссылки в корневом каталоге приложения (поскольку я импортировал его в начале файла в файле модели в trial_balance_entry.

Я исправил это, переместив импорт в один из внутренних методов моей модели TrialBalanceEntry. Это убедило, что у меня не было скрытых круговых зависимостей.

P.S. В следующий раз, пожалуйста, предоставьте стопку из консоли, чтобы мы могли легче отлаживать ее.

0

Хранение его коротким и точным. Введите это значение по умолчанию. Если ПРИМЕР-

 nickname = models.CharField(max_length=12, default=" ") 

и не по умолчанию = True. Если это не работает, удалите миграции в папке миграции вашего приложения, за исключением

 __init__.py file and type both the commands again. 
     python manage.py migrate 
     python manage.py makemigrations appname 
     python manage.py migrate(again) 

Надеется, что это помогает .. :)