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
Это должно помочь!