Django - 没有这样的表异常
Posted
技术标签:
【中文标题】Django - 没有这样的表异常【英文标题】:Django - no such table exception 【发布时间】:2016-04-05 13:32:05 【问题描述】:在 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'))
你知道问题出在哪里吗? 谢谢
【问题讨论】:
您是否尝试过清除数据库并重试?您的迁移将尝试创建所有内容,但有些内容已经存在并且无论如何都会失败。 你的意思是manage.py刷新吗?是的,我这样做了,但没有帮助。如何清除数据库? 你能在 sql shell 中运行它吗? select * from django_migrations where app='auth_test';并发布输出? @Paulo 我已经在 SQLite 浏览器中执行了查询。它只返回一行:id:11;应用程序:auth_test;名称:0001_initial;申请时间:2015-12-29 21:06:08.101000 您能在 gist 中发布 auth_test.0001_initial 迁移吗? 【参考方案1】:我用这些步骤解决了同样的问题:
删除项目目录中的数据库(在我的情况下为db.sqlite3
)
从您的项目子目录下的__pycache__
文件夹中删除所有内容
对于您要修复的应用程序,转到文件夹并清除 migrations
和 __pycache__
目录
当您确定已清除所有上述文件时,运行:
python manage.py makemigrations
python manage.py migrate
我希望这会有所帮助。
【讨论】:
斗智斗勇:如果manage makemigrations
是抛出“django.db.utils.OperationalError: no such table: ......”错误怎么办?
打开到 > python manage.py shell 然后输入 > from model_name.models import model1,model2 然后在调用 > model1.objects.all() 后我有同样的问题我得到了错误-- django.db.utils.OperationalError: no such table: model1
此解决方案将“有效”,但它需要对您的迁移文件夹进行核对,这会让您在生产中感到头疼,尤其是在大规模生产中。如果您偶然发现了此评论并且您只打算在家用 PC 上运行您的代码,您可以掸掉自己的灰尘并继续使用此答案。如果您的代码将涉及生产服务器和/或您想知道为什么这在生产中是一个坏主意,请查看link,然后阅读 Terry Brown 的解决方案。
@buzzzz 我尝试了 manage,py migrate --run-syncdb 作为下面建议的海报并且它有效。我试着弄乱有趣的 FieldSets 并以某种方式破坏了它。你能对此发表评论吗?
对我来说从sqlite
切换到mysql
有帮助。我有类似的问题。当我删除整个 db.sqlite3
文件并删除所有 __pycache__
文件和所有 make 迁移文件时,我的一些表仍然丢失。我使用sqlite
数据库浏览器发现了这一点。对我来说,将mysql
带到生产环境更方便,所以我所做的任何更改都可以很好地使用上述两行代码。【参考方案2】:
另一种情况会产生 no such table 错误。如果您的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
【讨论】:
我想我有这个问题,但上面的代码 sn-p 应该在哪里运行?什么是 Format 和 Geom_type?看起来像模特,但他们住在哪里? (我得到“名称错误:名称'格式'未定义”) @MrJalapeno 代码位于views.py 的开头。 Format 和 Geom_type 特定于我的应用程序。 - 我试图制作可用格式/Geom_Types 的模块级列表,但在尚未创建数据库时失败。如果您正在做类似的事情,那么包装在 try:/except: 中可能会有所帮助。 谢谢!让它工作了:) 我的视图导入了我的表单,其中查询导致了问题。如果我在数据库启动并运行之前将其注释掉,则有效。 您能否发布一个示例,说明“views.py 或类似的执行代码在导入时尝试访问数据库”的样子?我不确定这是否是我的情况。谢谢! 花了大约 2 个小时,阅读并尝试了无数来自 SO、GitHub 的东西,无论我能找到什么......你救了我。与 forms.py 中的 @MrJalapeno 一样,我使用这些值来填充 Char 字段的选择。我还必须在我的 models.py 中使用您的代码,因为一个模型的选择取决于另一个模型在行中的唯一值。非常感谢!!!!【参考方案3】:添加到 terry_brown 的回答中,这就是导致我的问题的原因。我有一个自定义用户模型,其中 ForeignKey 是另一个模型。我将默认设置为数据库中的第一个对象。当我在数据库中有数据时,它起作用了。但是当我从头开始时,它不起作用,因为它在导入时立即执行(所以甚至没有通过迁移)。
class User(AbstractBaseUser, PermissionsMixin):
subscription_plan = models.ForeignKey(SubscriptionPlan, default=SubscriptionPlan.objects.first().id)
我不得不牺牲 default
(将其注释掉)。
更新: 更好的解决方案是使用初始迁移或固定装置预填充您的数据库。
【讨论】:
这里有同样的问题。就我而言,我有一个类试图在其构造函数中访问数据库。【参考方案4】:也许没时间了,但是...当我尝试将 Django 1.11 安装“克隆”到其他目录中,然后最初尝试管理 makemigrations 时,我遇到了同样的问题。
我通过以下方式解决问题:
-
设置初始 Django 安装和创建主应用程序:
django-admin.py startproject app_name
初始迁移 管理makemigrations,管理迁移
设置超级用户:
管理创建超级用户
复制除主目录中的 urls.py 和 settings.py 之外的所有文件和目录(Django 应用程序)
将所有应用添加到 INSTALLED_APPS
管理 makemigrations,管理迁移
从源 Django 应用程序目录复制 settings.py 和 urls.py
没有错误,一切正常。
彼得
【讨论】:
【参考方案5】:如果其他人遇到此问题并且接受的解决方案不起作用,请查看您的数据库路径,
数据库路径应该是绝对路径,
'NAME': '/pathto-db/default.db',
Link
【讨论】:
【参考方案6】:运行下面的命令。一旦这个问题解决了我
manage.py 迁移 --run-syncdb
【讨论】:
不知道为什么,但它解决了我的问题:我只有在生产时才拥有它。它在开发中运行良好。谢谢! 这也解决了我的问题,不需要像上面推荐的答案那样删除任何文件。 我知道这是一个旧线程但是有没有人有任何理由解释为什么会这样? +1 解决我的问题!【参考方案7】:为了解决这个问题,我这样做了(在 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
【讨论】:
所有答案都指向只是迁移,但对我来说关键是在步骤 2 中删除 db.sqlite3! 就是这样【参考方案8】:在运行任何管理命令“django.contrib.admin”时,会自动尝试在已安装的应用中发现和管理 admin.py 模块。
如果有与数据库相关的代码,当在数据库中找不到与数据相关的表时,它会自动运行并尝试从数据库中加载数据,抛出此错误。
要修复此错误,只需将INSTALLED_APPS
中的"django.contrib.admin"
更改为"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
【讨论】:
当admin.py
中的代码尝试查找某些值数据并导致错误时,除此之外没有其他答案可以解决问题。但这剥夺了superuser
甚至view
来自admin
的模型的权利。【参考方案9】:
如果上述解决方案都不适合您,请添加 appname
以及 makemigration
和 migrate
命令。
makemigration login
migrate login
这可能会帮助您找出问题所在。
【讨论】:
【参考方案10】:按照此步骤解决此问题。
python manage.py migrate --fake APPNAME zero
这将使您的迁移变得虚假。现在你可以运行迁移脚本了
python manage.py migrate APPNAME
或
python manage.py migrate
将创建表格并解决您的问题.. 干杯!!!
【讨论】:
【参考方案11】:您不需要视图来进行迁移。注释掉 urls.py 中对其他应用程序的所有引用,清除 db 和旧迁移,运行 makemigrations,然后重新注释您的 urls.py。为我工作。
【讨论】:
【参考方案12】:我阅读了其他团队给出的上述答案。 主要是要求删除 SQLite(DB) 并重置“迁移”文件夹。
如果您在生产环境中工作,那么这将不是正确的选择。
python manage.py migrate --fake APPNAME zero
python manage.py migrate APPNAME
python manage.py makemigrations APPNAME
python manage.py migrate APPNAME
这四个步骤足以解决这个问题。
【讨论】:
第一步没有成功【参考方案13】:创建模型时出现此错误。 我打开了 db.sqlite3 文件并使用 SQLite DB Browser 为模型创建了一个表。然后我创建了一个迁移并假迁移它。不知道是什么导致了这个问题,但这个解决方法有帮助。
【讨论】:
【参考方案14】:我遇到了同样的问题。 以上解决方案都不适合我。 这一切可能始于我添加一个新模型,在数据库中有一些对象,然后我更改了模型的名称。 我需要从我的应用程序中删除整个模型,然后运行应用程序的管理页面。然后我通过在我删除它的所有文件中单击 ctrl + z 来恢复模型,最后我能够运行 makemigrations 和 migrate 命令。
【讨论】:
【参考方案15】:您会删除生产银行吗? 我看到很多都把sqlite删了,但是如果是生产银行呢?
从 django_migrations tableless contenttypes 中删除数据的解决方案
已经在表格 django_content_type 你远程 app_label
在迁移文件夹中删除除了 init.py
之外的所有内容python manage.py makemigrations
python manage.py migrate --fake
这就是我解决应用程序重复问题的方法(安装插件后我有两个同名的应用程序),django 创建了丢失的表等。
在我正常工作的情况下
【讨论】:
【参考方案16】:我遇到了同样的错误。我用来解决这个问题的步骤是:
确保您的应用中有migrations
文件夹。如果没有,在app文件夹内创建migrations
文件夹,然后在文件夹内创建__init__.py
文件。
如果migrations
文件夹已经存在,则删除所有migration files
。
删除默认为db.sqlite3
的数据库文件。
运行命令python manage.py makemigrations
python manage.py migrate
【讨论】:
【参考方案17】:解决我的错误的唯一方法是注释掉每个单个文件。当文件认为数据库不为空或它确实存在时,可能会发生此错误。
我刚刚注释掉了整个项目,迁移,取消了models.py文件的注释,再次迁移,取消了整个项目的注释。我不知道它为什么起作用。
【讨论】:
【参考方案18】:同样的错误并且没有删除数据库:
移除迁移 删除__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
其中 alias 是应用名称。
【讨论】:
【参考方案19】:如果您已删除数据库并立即迁移,则会发生这种情况。
例如,如果您的错误表明没有这样的表 table1
那么
这里 table1 是表的名称,app1 是 table1 模型所在的 Django 应用名称。
【讨论】:
【参考方案20】:使用 Django,我必须执行:
python manage.py migrate --run-syncdb
【讨论】:
在删除旧迁移并重新运行 makemigrations 后为我工作,迁移失败。 @othnin 如果您已经删除了旧的迁移,请清理您的数据库并重新迁移。【参考方案21】:由于 Django 的数据库而发生此错误,这不是用户错误。它最简单的解决方案是创建新的 app with different name 。然后创建相同的模型,然后运行 python manage.py makemigrations 然后迁移。通过这样做,您的错误应该得到解决
【讨论】:
【参考方案22】:我知道这通常通过删除开发过程中使用的 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 表包含此文件的日志,这是为了防止执行已经完成的迁移。
如果是这种情况,您将从该表中删除您的应用迁移记录。
【讨论】:
【参考方案23】:我对我的数据库进行了一些更改,但遇到了同样的问题。没有一个解决方案对我有用,所以花了几个小时后,我终于决定删除“db.sqlite3”文件并运行 makemigrations 和 migrate 命令。之后它工作正常。但是这个解决方案不是立即使用的好方法,只有在你没有选择的时候才使用它。
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于Django - 没有这样的表异常的主要内容,如果未能解决你的问题,请参考以下文章