Django - 没有这样的表异常

Mil*_*ano 11 python sqlite django migrate makemigrations

在Django中,我添加了一些模型models.py.之后manage.py makemigrations,manage.py migrate提出了这个例外:

django.db.utils.OperationalError: no such table: auth_test_usertranslatorprofile
Run Code Online (Sandbox Code Playgroud)

所以我删除了所有旧的迁移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
Run Code Online (Sandbox Code Playgroud)

我正在附上我的文件:

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)
Run Code Online (Sandbox Code Playgroud)

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'))
Run Code Online (Sandbox Code Playgroud)

你知道问题出在哪里吗?谢谢

aks*_*aks 41

我用这些步骤解决了同样的问题:

  • 删除db.sqlite3项目目录中的数据库(在我的例子中)
  • 从__pycache__项目子目录下的文件夹中删除所有内容
  • 您正在试图修复应用程序,进入该文件夹并清除migrations和__pycache__目录

如果您确定已清除所有上述文件,请运行:

python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • 该解决方案将“起作用”,但它需要破坏您的迁移文件夹,这会给您带来麻烦,尤其是在大规模生产中。如果您偶然发现了此评论,并且您只会在家用电脑上运行代码,那么您可以掸掉身上的灰尘并继续使用此答案。如果您的代码将接触生产服务器和/或者您很好奇为什么这在生产中是一个坏主意,请查看[链接](https://www.algotech.solutions/blog/python/django -migrations-and-how-to-manage-conflicts/),然后阅读 Terry Brown 的解决方案。 (4认同)
  • 达到智慧结束:如果`manage makemigrations`是抛出"django.db.utils.OperationalError:没有这样的表:......"的错误? (3认同)

Ter*_*own 21

wihch的另一个案例可以生成没有这样的表错误.如果您的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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!虽然它可以工作:)我的视图导入了我的表单,其中查询导致了问题。如果我将其注释掉直到数据库启动并运行,则有效。 (2认同)
  • 花了大约 2 个小时,阅读并尝试了 SO、GitHub 上无数的东西,无论我能找到什么......。你救了我。与我的 forms.py 中的 @MrJalapeno 一样,我使用了这些值来填充 Char 字段的选择。我还必须在 models.py 中使用您的代码,因为一个模型的选择取决于另一个模型在行中的唯一值。多谢 !!!! (2认同)

Ajm*_*mir 21

在命令下运行。一旦这个问题它就解决了我

manage.py migrate --run-syncdb


Soh*_*med 15

使用 Django,我必须执行:

python manage.py migrate --run-syncdb


ada*_*dam 11

为了解决这个问题,我做了这个(在 Ubuntu 上,你需要调整 Windows 的命令):

1. 删除所有迁移文件

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete

find . -path "*/migrations/*.pyc"  -delete
Run Code Online (Sandbox Code Playgroud)

2.删除db.sqlite3

rm db.sqlite3
Run Code Online (Sandbox Code Playgroud)

3. 创建并运行迁移:

python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

4. 同步数据库:

manage.py migrate --run-syncdb
Run Code Online (Sandbox Code Playgroud)

删除数据库有点麻烦,但对于测试系统来说很好。从这个普遍优秀的资源中获得了最后一步:https : //simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html


kot*_*rfa 6

再加上terry_brown的答案,这就是导致我遇到问题的原因。我有一个与ForeignKey到另一个模型的自定义用户模型。我将默认值设置为数据库中的第一个对象。当我将数据存储在数据库中时,它起作用了。但是,当我从头开始时,它不起作用,因为它在导入时立即执行了(因此甚至没有迁移完成)。

class User(AbstractBaseUser, PermissionsMixin):
    subscription_plan = models.ForeignKey(SubscriptionPlan, default=SubscriptionPlan.objects.first().id)
Run Code Online (Sandbox Code Playgroud)

我不得不为此牺牲default(注释掉)。

更新:更好的解决方案是使用初始迁移或固定装置预填充数据库。

  • 这里同样的问题。就我而言,我有一个试图在其构造函数中访问数据库的类。 (2认同)

Ash*_*pta 5

请按照以下步骤解决此问题。

python manage.py migrate --fake APPNAME zero
Run Code Online (Sandbox Code Playgroud)

这将使您的迁移变得虚假。现在您可以运行迁移脚本

python manage.py migrate APPNAME
Run Code Online (Sandbox Code Playgroud)

或者

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

将创建表格,您解决了您的问题..干杯!