OperationalError: нет такой таблицы в исходном syncdb

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

У меня есть следующее в 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 строк трассировки, последняя часть которых:

  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

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

Спасибо!

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

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

3 ответа

У меня была эта проблема с локальной базой данных 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 сам по себе должен работать.

Так как вы изменили имена полей в модели, я предполагаю, что вы используете юг для управления миграциями. В этом случае: south не инициализирует базу данных до тех пор, пока не запустится syncdb, когда вы запустите миграцию. Джанго загружает все __init__ а также models.py файлы при запуске сервера. Любой код в этих файлах, который требует доступа к базе данных, должен быть заключен в попытку / за исключением случаев, когда они используют на юг.

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

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

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

Хотя обсуждение немного старое, у меня была та же ошибка, потому что я использовал 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 решает проблему

Эта ошибка возникла после того, как вы изменили поля в своих моделях. Таблица создана ранее и не изменяется там. Так что закомментируйте модели и соответствующие им и попробуйте./manage.py makemigrations ./manage.py migrate --fake

Теперь удалите комментарий и запустите

./manage.py makemigrations./manage.py migrate

Это должно помочь!

Другие вопросы по тегам