Django - 没有这样的表异常

时间:2015-12-31 16:01:46

标签: python django sqlite migrate makemigrations

在Django中,我已将一些模型添加到models.py中。在manage.py makemigrations之后,manage.py migrate提出了此异常:

django.db.utils.OperationalError: no such table: auth_test_usertranslatorprofile

所以我删除了所有旧的迁移并再次运行makemigrationsmigrate,这似乎有效。

不幸的是,我注意到它没有帮助,因为当我尝试点击User customer profiles的{​​{1}}时,它会引发异常:

环境:

User translator profiles

我附上了我的文件:

MODELS.PY:

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

ADMIN.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)

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

21 个答案:

答案 0 :(得分:39)

我通过以下步骤解决了同样的问题:

  • 删除项目目录中的数据库(在我的情况下为db.sqlite3
  • 从项目子目录
  • 下的__pycache__文件夹中删除所有内容
  • 对于您尝试修复的应用程序,请转到该文件夹​​并清除migrations__pycache__目录

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

python manage.py makemigrations
python manage.py migrate

我希望这会有所帮助。

答案 1 :(得分:17)

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

答案 2 :(得分:2)

使用 Django,我必须执行:

python manage.py migrate --run-syncdb

答案 3 :(得分:1)

我阅读了其他团队给出的上述答案。 主要是要求删除SQLite(DB)并重置“迁移”文件夹。

如果您在生产环境中工作,那么这将不是正确的选择。

  1. python manage.py migrate --fake APPNAME zero
  2. python manage.py migrate APPNAME
  3. python manage.py makemigrations APPNAME
  4. python manage.py migrate APPNAME

这四个步骤足以解决此问题。

答案 4 :(得分:1)

这个错误是因为 Django 的数据库而发生的,这不是用户的错误。最简单的解决方案是创建新的具有不同名称的应用。然后创建相同的模型,然后运行python manage.py makemigrations,然后迁移。通过这样做,您的错误应该可以解决

答案 5 :(得分:1)

我有同样的问题。 以上解决方案均不适用于我。 当我添加一个新模型,在数据库中有一些对象然后更改模型的名称时,一切可能就开始了。 我需要从我的应用程序中删除整个模型,然后运行应用程序的管理页面。然后,我通过在删除了该文件的所有文件中单击ctrl + z来恢复该模型,最后我能够运行makemigrations和迁移命令。

答案 6 :(得分:1)

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

python manage.py migrate --fake APPNAME zero

这将使您迁移到伪造。现在您可以运行迁移脚本

python manage.py migrate APPNAME

OR

python manage.py migrate

表将被创建,您可以解决您的问题。

答案 7 :(得分:1)

运行任何管理命令“ django.contrib.admin”时,系统会自动尝试在已安装的应用程序中发现和管理模块。

如果有与数据库相关的代码,它将自动运行并在无法在数据库中找到与数据相关的表时尝试从数据库加载数据。

要解决此错误,只需将"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/#troubleshooting

答案 8 :(得分:0)

如果上述解决方案都不适合您,请添加appname以及makemigrationmigrate命令。

 makemigration login
 migrate login

这可能有助于您找出问题所在。

答案 9 :(得分:0)

您不需要视图即可进行迁移。注释掉urls.py对其他应用程序的所有引用,清除数据库和旧迁移,运行makemigrations,然后再注释掉urls.py。为我工作。

答案 10 :(得分:0)

要解决这个问题,我做到了(在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

答案 11 :(得分:0)

创建模型时出现此错误。 我打开了db.sqlite3文件,并使用SQLite DB浏览器为该模型创建了一个表。然后,我创建了一个迁移并进行了伪造迁移。不知道是什么原因引起的问题,但是此解决方法有所帮助。

答案 12 :(得分:0)

在命令下面运行。这个问题解决了我

manage.py迁移--run-syncdb

答案 13 :(得分:0)

您要删除生产银行吗? 我看到很多人都删除了sqlite,但是如果是生产银行呢?

从django_migrations表中删除较少内容类型的数据的解决方案

已经在表django_content_type中,您已远程使用app_label

在迁移文件夹内的

会删除除 init .py

之外的所有内容

python manage.py makemigrations

python manage.py migration --fake

这就是我解决应用程序重复问题的方法(安装插件后,我有两个应用程序具有相同的名称),而django则创建了丢失的表。

在正常情况下

答案 14 :(得分:0)

我遇到了同样的错误。我用来解决此问题的步骤是:

  1. 确保您的应用程序中有migrations文件夹。如果没有,请在app文件夹中创建migrations文件夹,然后在该文件夹中创建__init__.py文件。

  2. 如果migrations文件夹已经存在,则删除所有migration files

  3. 删除默认为db.sqlite3的数据库文件。

  4. 运行命令python manage.py makemigrations

  5. python manage.py migrate

答案 15 :(得分:0)

解决我的错误的唯一方法是注释掉每个单个文件。当文件认为数据库不为空或它实际存在时,可能会发生此错误。

我只是注释掉了整个项目,对其进行了迁移,取消对models.py文件的注释,再次对其进行了迁移,对整个项目进行了注释。我不知道它为什么起作用。

答案 16 :(得分:0)

具有相同错误且未删除数据库:

  • 删除迁移
  • 删除__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

别名是应用程序名称。

答案 17 :(得分:0)

如果您已删除数据库并立即迁移,则会发生这种情况。

例如,如果您的错误显示没有这样的表 table1 那么

  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py table1 app1

这里table1是表的名称,app1是table1模型所在的Django应用名称。

答案 18 :(得分:0)

如果其他人遇到此问题,并且接受的解决方案无法正常工作,请查看您的数据库路径, db路径应该是绝对路径, 'NAME': '/pathto-db/default.db',

Link

答案 19 :(得分:0)

也许时间不对,但是...当我尝试将Django 1.11安装“克隆”到其他目录,然后尝试管理makemigrations时,我遇到了同样的问题。

我通过以下方式解决问题:

  1. settup初始Django安装并通过以下方式创建主应用程序:

django-admin.py startproject app_name

  1. 初始迁移 管理makemigrations,管理迁移

  2. 设置超级用户:

管理createsuperuser

  1. 复制主目录中的urls.py和settings.py以外的所有文件和目录(Django应用程序)

  2. 将所有应用添加到INSTALLED_APPS

  3. 管理makemigrations,管理迁移

  4. 从源Django应用程序目录中复制settings.py和urls.py

那没错,一切都很好。

石油

答案 20 :(得分:0)

我知道这通常通过删除开发过程中使用的 de sqlite3 DB 来解决。

另外,我知道这个问题目前已经解决,但我想把我的案例留在这里作为替代。

有时在我们编程时,我们会更改模型中的很多内容。当我们运行 python manage.py makemigrations 时,会在 app folder/migrations 中创建一个文件。当我们运行 python manage.py migrate 时,会在 django_migrations 表中创建一条记录。此记录包含 3 个我们必须详细检查的字段:

  • 1 - 名称(这是在迁移应用文件夹中创建的文件名)
  • 2 - 应用程序(这是我们应用程序的名称。也像命名空间一样工作以防止冲突)
  • 3 - 已应用(这是执行迁移的日期时间)。

如果你之前修改过你的模型,你应该在迁移中有几个文件(数量与你在每次更改时执行 makemigrations 的时间相应),在我的情况下,我想删除这些文件只是为了只有一个迁移文件。

问题在于,当再次运行 makemigrations 时,它会创建一个文件 0001_initial.py。如果您记得表 django_migrations 包含此文件的日志,这是为了防止执行已经完成的迁移。

如果是这种情况,您可以从此表中删除应用迁移记录。