2014-01-10 2 views
2

Я запускаю syncdb для создания sqlite db. Он работал до недавнего времени, и я не вижу ничего, что я изменил, что может привести к его провалу. В основном я просто изменил имена полей.OperationalError: нет такой таблицы на исходном syncdb

У меня есть следующие в models.py:

class GC_User(models.Model): 
     first_name = models.CharField(max_length=50) 
     last_name = models.CharField(max_length=50) 
     email = models.EmailField() 
     wp_userID = models.PositiveSmallIntegerField(unique=True) 

Когда я бегу SyncDB после удаления старого файла базы данных, я получаю 150 строк TRACEBACK, последняя часть которой:

File "C:\Python33\lib\site-packages\django\db\backends\util.py", line 53, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Python33\lib\site-packages\django\db\backends\sqlite3\base.py", line 450, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.OperationalError: no such table: gameconapp_gc_user 

Любые мысли о том, что может быть причиной этого? Я могу добавить больше трассировки, если это будет полезно.

Спасибо!

Update: После долгого копания, мой партнер определил, что проблема заключалась в том, что приложения init.py было вызывалось. Поскольку обычная процедура пыталась получить доступ к таблице GC_User, она не получила такую ​​табличную ошибку.

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

+0

Вы можете инициализировать свое приложение в 'try/except' и терпеть неудачу, если таблица базы данных еще не установлена. Таким образом, вам не нужно думать о раскомментировании производственных изменений. – Thomas

ответ

1

Поскольку вы изменили имена полей в модели, я предполагаю, что вы используете юг для обработки миграции. Если это так: юг не инициализирует базу данных до тех пор, пока syncdb не выполнит миграцию. Django загружает все файлы __init__ и models.py при запуске севера. Любой код в этих файлах, требующий доступа к базе данных, должен быть завернут в try/except, когда они используют юг.

try: 
    #code requiring database access here 
except OperationalError: 
    #close the database connection 
    connection.close() 

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

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

+0

Я не совсем знаком с югом; Я в основном преподавал себя в документах с большим количеством проб и ошибок. Это звучит полезно. Код, который я поставил в init.py, действительно не нужно запускать при каждом запуске, поэтому я помещаю его в меню задач, которые диспетчер или администратор могут запускать явно. –

+0

@BeverlyBlock это было какое-то время и не видел вашего комментария. Юг вступает в игру, когда вы хотите изменить поля модели и НЕ должны сбросить свою базу данных. Он перенесет вашу существующую базу данных в соответствии с новыми полями. Он очень прост в использовании и будет частью django в следующем выпуске, поэтому обязательно начните использовать его. – arctelix

1

Хотя обсуждение староват, у меня была такая же ошибка, потому что я использовал ChoiceFields, для которых выбор необходимых подключение БД, например:

class ExpenseIndividualForm(Form): 
    """ 
    Form to get a specific expense (Individual) 
    """ 
    date = forms.DateField(label=u"Date", initial=datetime.date.today()) 
    category = forms.ChoiceField(label=u"Catégorie", choices=get_individual_choices()) 
    employee = forms.ChoiceField(label=u"Utilisateur", choices=get_employee_choices()) 

, для которых функции get_individual_choices и get_employee_choice поиск в базе данных ,

Когда я выполнил manage syncdb, он импортирует классы и выполняет инициализационные коды, что вызывает очень неясную ошибку.

По предложению arctelix, защищая код этих функций внутри try... except OperationalError решает проблему

2

Я имел этот вопрос с локальной базой данных SQLite 3. Сначала я удалил файл, чтобы убедиться.

Чтобы решить эту проблему, я использовал syncdb --no-initial-data затем приступал использовать migrate с каждым приложением упоминалось, что было заявлено, не синхронизируются:

./manage.py syncdb --no-initial-data 
./manage.py migrate app1 
./manage.py migrate app2 
./manage.py migrate app3 

Там не гарантируется порядок, так это должно быть сделано вручную и просто проверить какой порядок работает для вас. В моем случае приложение simple_email_confirmation должно было быть сделано раньше всего. После нескольких попыток, ./manage.py migrate сам по себе должен работать.

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