Джанго - нет такого исключения таблицы

В 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(БД) и сбросить папку "миграции".

Если вы работаете в производственной среде, это будет неправильный выбор.

  1. python manage.py migrate --fake APPNAME zero
  2. python manage.py перенести APPNAME
  3. python manage.py makemigrations APPNAME
  4. 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.

https://docs.djangoproject.com/en/3.0/ref/applications/

Я столкнулся с той же ошибкой. Для решения этой проблемы я использовал следующие шаги:

  1. Убедитесь, что есть migrationsпапка внутри вашего приложения. Если их нет, создайтеmigrations папку внутри папки приложения, а затем создайте __init__.py файл внутри папки.

  2. Если migrations папка уже есть, удалите все migration files.

  3. Удалите файл базы данных, который по умолчанию db.sqlite3.

  4. Запустите команду python manage.py makemigrations

  5. 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-миграциями.

Я решаю проблему следующим образом:

  1. произвести первоначальную установку Django и создать основное приложение:

django-admin.py startproject имя_приложения

  1. начальные миграции управляют миграциями, управляют миграцией

  2. Настройте суперпользователя:

управлять создателем суперпользователя

  1. скопировать все файлы и каталоги (приложения Django), кроме urls.py и settings.py в основной каталог

  2. Добавлены все приложения в INSTALLED_APPS

  3. управлять makemigrations, управлять миграцией

  4. Скопированы 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, снова перенёс, раскомментировал весь проект. Понятия не имею, почему это сработало.

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