Джанго - нет такого исключения таблицы
В Django я добавил несколько моделей в models.py
, После manage.py makemigrations
, manage.py migrate
поднял это исключение:
django.db.utils.OperationalError: no such table: auth_test_usertranslatorprofile
Итак, я удалил все старые миграции и запустил makemigrations
а также migrate
снова, который, казалось, работал.
К сожалению, я заметил, что это не помогло, потому что, когда я пытаюсь нажать на User customer profiles
из User translator profiles
это вызывает исключение:
Среда:
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/auth_test/usertranslatorprofile/
Django Version: 1.8.7
Python Version: 2.7.10
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'auth_test')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware')
Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py" in wrapper
618. return self.admin_site.admin_view(view)(*args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in _wrapped_view
110. response = view_func(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
57. response = view_func(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\contrib\admin\sites.py" in inner
233. return view(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in _wrapper
34. return bound_func(*args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in _wrapped_view
110. response = view_func(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in bound_func
30. return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py" in changelist_view
1550. self.list_max_show_all, self.list_editable, self)
File "C:\Python27\lib\site-packages\django\contrib\admin\views\main.py" in __init__
82. self.get_results(request)
File "C:\Python27\lib\site-packages\django\contrib\admin\views\main.py" in get_results
177. result_count = paginator.count
File "C:\Python27\lib\site-packages\django\core\paginator.py" in _get_count
72. self._count = self.object_list.count()
File "C:\Python27\lib\site-packages\django\db\models\query.py" in count
318. return self.query.get_count(using=self.db)
File "C:\Python27\lib\site-packages\django\db\models\sql\query.py" in get_count
466. number = obj.get_aggregation(using, ['__count'])['__count']
File "C:\Python27\lib\site-packages\django\db\models\sql\query.py" in get_aggregation
447. result = compiler.execute_sql(SINGLE)
File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
840. cursor.execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\backends\utils.py" in execute
79. return super(CursorDebugWrapper, self).execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\backends\utils.py" in execute
64. return self.cursor.execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\utils.py" in __exit__
98. six.reraise(dj_exc_type, dj_exc_value, traceback)
File "C:\Python27\lib\site-packages\django\db\backends\utils.py" in execute
64. return self.cursor.execute(sql, params)
File "C:\Python27\lib\site-packages\django\db\backends\sqlite3\base.py" in execute
318. return Database.Cursor.execute(self, query, params)
Exception Type: OperationalError at /admin/auth_test/usertranslatorprofile/
Exception Value: no such table: auth_test_usertranslatorprofile
Я прилагаю свои файлы:
MODELS.PY:
from django.db import models
from django.contrib.auth.models import User
class Language(models.Model):
shortcut = models.CharField(max_length=6)
name = models.CharField(max_length=50)
price_per_sign = models.FloatField()
class UserTranslatorProfile(models.Model):
user = models.OneToOneField(User)
languages = models.ManyToManyField(Language)
price_per_word = models.FloatField()
class UserCustomerProfile(models.Model):
user = models.OneToOneField(User)
ADMIN.PY:
from django import forms
from .models import Language
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class FreelancerRegistrationForm(forms.Form):
language = forms.ModelChoiceField(queryset=Language.objects.all().order_by('shortcut'))
Знаете ли вы, где проблема? Спасибо
29 ответов
Я решил ту же проблему с этими шагами:
- Удалить вашу базу данных (
db.sqlite3
в моем случае) в каталоге вашего проекта - Удалить все из
__pycache__
папка в подкаталоге вашего проекта - Для приложения, которое вы пытаетесь исправить, перейдите в папку и очистите
migrations
а также__pycache__
каталоги
Когда вы уверены, что очистили все вышеуказанные файлы, запустите:
python manage.py makemigrations
python manage.py migrate
Надеюсь, это поможет.
Запустите команду ниже. Это решает меня однажды эту проблему
manage.py migrate --run-syncdb
Другой случай, который может привести к ошибке " нет такой таблицы". Если ваш views.py или аналогичный исполняет код, который пытается получить доступ к БД при импорте, то есть импорт views.py имеет побочные эффекты, то начинать с нуля не получится.
Это происходит, когда ваш код работал с существующей БД, а теперь вы пытаетесь начать без БД. Просто измените views.py, чтобы он мог быть импортирован без побочных эффектов. Если вы не хотите исправлять дизайн, сделайте что-то вроде:
from django.db.utils import OperationalError
format_list = [('', '(all)')]
geom_type_list = [('', '(all)')]
try:
format_list.extend([(i[0],i[0])
for i in Format.objects.values_list('name')])
geom_type_list.extend([(i[0],i[0])
for i in Geom_type.objects.values_list('name')])
except OperationalError:
pass # happens when db doesn't exist yet, views.py should be
# importable without this side effect
Чтобы решить эту проблему, я сделал это (в Ubuntu вам нужно адаптировать команды для Windows):
1. Удалите все файлы миграции.
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
2. Удалите db.sqlite3
rm db.sqlite3
3. Создайте и запустите миграции:
python manage.py makemigrations
python manage.py migrate
4. Синхронизируйте базу данных:
manage.py migrate --run-syncdb
Немного проблем, так как вам нужно удалить базу данных, но это нормально для тестовой системы. Получил все, кроме последнего шага, из этого в целом отличного ресурса: https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html
Используя Django, мне пришлось выполнить:
python manage.py migrate --run-syncdb
Добавление к ответу terry_brown, вот что вызывает у меня проблемы. У меня была пользовательская модель с ForeignKey для другой модели. И я установил по умолчанию первый объект в БД. Это сработало, когда у меня были данные в базе данных. Но когда я начал с нуля, он не работал, потому что он был выполнен сразу после импорта (так что даже миграция не прошла).
class User(AbstractBaseUser, PermissionsMixin):
subscription_plan = models.ForeignKey(SubscriptionPlan, default=SubscriptionPlan.objects.first().id)
Я должен был пожертвовать этим default
(комментируя это).
Выполните следующие действия, чтобы исправить эту проблему.
python manage.py migrate --fake APPNAME zero
Это сделает вашу миграцию поддельной. Теперь вы можете запустить скрипт миграции
python manage.py migrate APPNAME
ИЛИ
python manage.py migrate
Таблицы будут созданы, и вы решили свою проблему.. Ура!!!
Я столкнулся с той же проблемой. Я удалил все миграции и запустил эту команду
python manage.py makemigrations
python manage.py migrate --run-syncdb
Это сработало для меня, и данные также были в безопасности (я ничего не потерял)
Я прочитал ответы других команд выше. В основном просили удалить SQLite(БД) и сбросить папку "миграции".
Если вы работаете в производственной среде, это будет неправильный выбор.
- python manage.py migrate --fake APPNAME zero
- python manage.py перенести APPNAME
- python manage.py makemigrations APPNAME
- python manage.py перенести APPNAME
Этих четырех шагов достаточно, чтобы решить эту проблему.
Возможно, папка миграции не была создана:
python manage.py makemigrations app_name
python manage.py migrate
Эта ошибка возникает из-за базы данных Django, это не ошибка пользователя. Самым простым решением является создание нового приложения с другим именем. Затем создайте те же модели, затем запустите python manage.py makemigrations и затем выполните миграцию. Таким образом ваша ошибка решена.
Вам не нужны представления для миграции. Закомментируйте все ссылки на другие приложения из urls.py, очистите базу данных и старые миграции, запустите makemigrations и закомментируйте свой urls.py обратно. Сработало для меня.
У меня такая же проблема. Ни одно из вышеперечисленных решений не помогло мне. Все, вероятно, началось, когда я добавил новую модель, имел несколько объектов в базе данных, а затем изменил имя модели. Мне нужно было удалить всю модель из моего приложения, а затем запустить страницу администратора приложения. Затем я восстановил модель, нажав ctrl + z во всех файлах, из которых я ее удалил, и, наконец, я смог запустить makemigrations и перенести команды.
При выполнении любой команды управления "django.contrib.admin" автоматически пытается обнаружить модули и модули admin.py в установленных приложениях.
Если есть код, связанный с базой данных, он запускается автоматически и пытается загрузить данные из базы данных, когда не может найти связанную с данными таблицу в базе данных, выдает эту ошибку.
Чтобы исправить эту ошибку, просто измените "django.contrib.admin"
в INSTALLED_APPS
к "django.contrib.admin.apps.SimpleAdminConfig"
, это предотвратит автоматическое обнаружение и запуск модулей администратора "django.contrib.admin".
django.contrib.admin автоматически выполняет автоматическое обнаружение модулей администратора в установленных приложениях. Чтобы предотвратить это, измените INSTALLED_APPS, чтобы он содержал django.contrib.admin.apps.SimpleAdminConfig вместо django.contrib.admin.
Я столкнулся с той же ошибкой. Для решения этой проблемы я использовал следующие шаги:
Убедитесь, что есть
migrations
папка внутри вашего приложения. Если их нет, создайтеmigrations
папку внутри папки приложения, а затем создайте__init__.py
файл внутри папки.Если
migrations
папка уже есть, удалите всеmigration files
.Удалите файл базы данных, который по умолчанию
db.sqlite3
.Запустите команду
python manage.py makemigrations
python manage.py migrate
Я внес некоторые изменения в свою базу данных и столкнулся с той же проблемой. Ни одно из решений не сработало для меня, поэтому, потратив несколько часов, я наконец решил удалить файл «db.sqlite3» и запустить команды makemigrations и migrate. После работал нормально. Но это решение не подходит для немедленного использования, используйте его только тогда, когда у вас нет вариантов.
Недавно у меня была проблема с этим, и я использовал сообщение @adam, чтобы решить свою проблему. Я просто хотел исправить свой пост и сказать, что для меня в Windows 10 с использованием git bash мне пришлось делать все это из venv, а затем, после того, как я удалил файлы миграции и БД, мне пришлосьpip uninstall django
иpip install django
перед выполнением миграций.
Я знаю, что это обычно решается путем удаления базы данных de sqlite3, которая используется в процессе разработки.
Кроме того, я знаю, что этот вопрос в настоящее время решен, но я хочу оставить свой случай здесь в качестве альтернативы.
Иногда во время программирования мы меняем много вещей в наших моделях. Когда мы бежим
python manage.py makemigrations
файл создается внутри нашего
app folder/migrations
. И когда мы бежим
python manage.py migrate
создается запись в таблице django_migrations. эта запись содержит 3 поля, которые мы должны детально проверить:
1 - имя (это имя файла, созданного в папке приложения миграции)
2 - приложение (это имя нашего приложения. Также работает как пространство имен для предотвращения конфликтов)
3 - применено (дата и время выполнения миграции).
Если вы ранее изменяли свою модель, у вас должно быть несколько файлов внутри миграций (количество зависит от того, сколько раз вы выполняли makemigrations при каждом изменении), в моем случае я хотел стереть эти файлы, чтобы иметь только один файл миграции.
Проблема в том, что при повторном запуске makemigrations создает файл 0001_initial.py. Если вы помните, что таблица django_migrations содержит журнал этого файла, это сделано для предотвращения выполнения уже выполненных миграций.
Если это ваш случай, вы должны стереть записи о миграции вашего приложения из этой таблицы.
Если у кого-то еще есть эта проблема, и принятое решение не работает, посмотрите на ваш путь к базе данных, путь к базе данных должен быть абсолютным,
'NAME': '/pathto-db/default.db',
Может быть, не вовремя, но... У меня возникла та же проблема, когда я пытался "клонировать" установку Django 1.11 в другой каталог, а затем при первоначальной попытке управлять make-миграциями.
Я решаю проблему следующим образом:
- произвести первоначальную установку Django и создать основное приложение:
django-admin.py startproject имя_приложения
начальные миграции управляют миграциями, управляют миграцией
Настройте суперпользователя:
управлять создателем суперпользователя
скопировать все файлы и каталоги (приложения Django), кроме urls.py и settings.py в основной каталог
Добавлены все приложения в INSTALLED_APPS
управлять makemigrations, управлять миграцией
Скопированы settings.py и urls.py из исходного каталога приложения Django
В этом нет ошибок, и все работает нормально.
Petr
Я получил эту ошибку при создании модели. Я открыл файл db.sqlite3 и создал таблицу для модели с помощью браузера БД SQLite. Затем я создал миграцию и фейк ее перенес. Не знаю, что вызвало проблему, но этот обходной путь помог.
Если ни одно из вышеперечисленных решений не помогло вам, добавьте appname
вместе с makemigration
а также migrate
команда.
makemigration login
migrate login
Это может помочь вам разобраться в проблеме.
Вы бы удалили производственный банк? Я видел, что у многих удален sqlite, но если это производственный банк?
решение для удаления данных из таблицы django_migrations без типов содержимого
уже в таблице django_content_type вы удаленно app_label
внутри папки миграции удаляет все, кроме init.py
python manage.py makemigrations
python manage.py migrate --fake
вот как я решил проблемы с дублированием приложений (у меня было два приложения с одинаковым именем после установки плагина), а django, среди прочего, создал недостающие таблицы.
в моем нормально работающем корпусе
Эта проблема возникает у меня, когда у меня есть функция/класс/и т.д. где-то, что использует поля из базы данных - обычно при использовании классов форм Django.
Пример:
brands = forms.MultipleChoiceField(
choices=[(b.name, b.id) for b in Brand.objects.all()],
widget=forms.CheckboxSelectMultiple()
)
Здесь я создаюMultipleChoiceField
запись в форму с помощьюname
иid
поля со всехbrand
записи объектов в базе данных. т.е. загрузка всех опций, которые пользователь может выбрать в базе данных из базы данных.
Когда база данных уже существует иapp_brand
таблица уже есть, проблем нет.
Однако при первоначальном создании миграции для этого приложения я получаю сообщение об ошибке:
django.db.utils.OperationalError: no such table: app_brand
У меня нет элегантного обходного пути, но я обычно делаю следующее:
# default brands
try:
brands = forms.MultipleChoiceField(
choices=[(b.name, b.id) for b in Brand.objects.all()],
widget=forms.CheckboxSelectMultiple()
)
except Exception as e:
brands = forms.MultipleChoiceField(
choices=[],
widget=forms.CheckboxSelectMultiple()
)
Это позволяет первоначальноpython manage.py makemigrations
команда, которая будет выдана без возбуждения исключения. Очевидным недостатком является то, что вероятны случаи, которые обычно приводят к сбою приложения, что теперь может просто привести к незаполненному полю формы в производственной среде.
TL;DR — Иногда это проблема, если приложение имеет функции/и т. д. которые обращаются к базе данных, такой как формы, и эти таблицы базы данных еще не существуют.
С той же ошибкой и без удаления базы данных:
- удалить миграции
- удалять
__pychache__
python manage.py makemigrations --empty alias
python manage.py makemigrations alias
python manage.py migrate alias zero
- удалить снова миграции
- удалить снова
__pycache__
python manage.py makemigrations
python manage.py migrate alias zero
Где псевдоним - это имя приложения.
У меня были похожие проблемы: я не мог выполнить миграцию ни в одной существующей базе данных и т. д. отключение импорта форм в представлении работает, импорт кода формы для просмотра тоже работает, но это решение:
я добавилmodel = super().__class__()
в каждомinit
функция в классе формы модели:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
model = super().__class__() # 'soft code' prevents operational error
self.fields['name'].required = False
А также мне нужно изменить список флажков:
# CATEG_CHOICES= Category.choices_objects.all()
# CATEG_CHOICES=Category.objects.values_list('id','name') # without ..
choice_list = []
try:
choice_list.extend(Category.choices_objects.all())
# choice_list.extend(Category.objects.values_list('id','name'))
except OperationalError:
pass # happens when db doesn't exist yet
CATEG_CHOICES=choice_list
просто беги
python manage.py makemigrations YOURAPP_NAME
python manage.py migrate
Если вы удалили БД и выполняете миграцию, это произойдет.
Например, если ваша ошибка говорит об отсутствии такой таблицы
table1
тогда
- python manage.py makemigrations
- python manage.py мигрировать
- Python manage.py table1 app1
Здесь table1 - это имя таблицы, а app1 - это имя приложения Django, в котором существует модель table1.
Единственный способ исправить мою ошибку - закомментировать каждый файл. Эта ошибка может возникнуть, если файл считает, что база данных не пуста или что она действительно существует.
Я просто закомментировал весь проект, перенёс, раскомментировал файл models.py, снова перенёс, раскомментировал весь проект. Понятия не имею, почему это сработало.