Django - 没有这样的表:main.auth_user__old
- 2025-03-05 09:17:00
- admin 原创
- 97
问题描述:
我按照官方 Django 文档中的第一个应用教程操作,在尝试保存通过管理页面所做的某些更改时出现此错误。我对此进行了一些研究,但我能找到的可能解决方案(例如迁移数据库)根本不起作用。如果您想查看我代码的某个特定部分,请告诉我。
以下是错误:
/admin/polls/question/1/change/ 上的 OperationalError 没有这样的表:main.auth_user__old 请求方法:POST 请求 URL: http ://127.0.0.1 :8000/admin/polls/question/1/change/ Django 版本:2.1.4 异常类型:OperationalError 异常值:没有这样的表:main.auth_user__old 异常位置:/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py 在执行中,第 296 行 Python 可执行文件:/Users/gfioravante/Projects/test_app/ta_env/bin/python3 Python 版本:3.7.1 Python 路径:
['/Users/gfioravante/Projects/test_app/test_app', '/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages'] 服务器时间:2018 年 12 月 5 日星期三 16:45:00 +0000
和回溯:
环境:
请求方式:POST 请求URL:
http://127.0.0.1:8000/ admin/polls/question/1/change/Django 版本:2.1.4 Python 版本:3.7.1 已安装的应用程序:['polls.apps.PollsConfig'、'django.contrib.admin'、'django.contrib.auth'、'django.contrib.contenttypes'、'django.contrib.sessions'、'django.contrib.messages'、'django.contrib.staticfiles'] 已安装的中间件:['django.middleware.security.SecurityMiddleware'、'django.contrib.sessions.middleware.SessionMiddleware'、'django.middleware.common.CommonMiddleware'、'django.middleware.csrf.CsrfViewMiddleware'、'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware']
追溯:
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”中的 _execute 85. 返回 self.cursor.execute(sql, params)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py”在执行 296 中返回 Database.Cursor.execute(self, query, params)
上述异常(没有这样的表:main.auth_user__old)是导致以下异常的直接原因:
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/core/handlers/exception.py”位于内部 34. response = get_response(request)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/core/handlers/base.py”中的 _get_response 126. response = self.process_exception_by_middleware(e,request)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/core/handlers/base.py”中的 _get_response 124。response = wrapped_callback(request, callback_args, *callback_kwargs)
包装器 604 中的文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”。返回 self.admin_site.admin_view(view)(args, *kwargs)
_wrapped_view 142 中的文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/utils/decorators.py”。response = view_func(request, args, *kwargs)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/views/decorators/cache.py”位于 _wrapped_view_func 44. response = view_func(request, args, *kwargs)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/sites.py”位于内部 223。返回视图(request、args、*kwargs)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”位于 change_view 1640 中。返回 self.changeform_view(request、object_id、form_url、extra_context)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/utils/decorators.py”位于 _wrapper 45 中。返回 bound_method(args, *kwargs)
_wrapped_view 142 中的文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/utils/decorators.py”。response = view_func(request, args, *kwargs)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”位于 changeform_view 1525 中。返回 self._changeform_view(request、object_id、form_url、extra_context)
_changeform_view 1571 中的文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”。self.log_change(request、new_object、change_message)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”位于 log_change 826 中。change_message=message,
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/models.py”中的log_action 35.change_message=change_message,
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/manager.py”中的 manager_method 82. 返回 getattr(self.get_queryset(), name)(args, *kwargs)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/query.py”中创建 413。obj.save(force_insert=True,using=self.db)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”保存在 718 中。force_update=force_update,update_fields=update_fields)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”位于 save_base 748 中。updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
_save_table 831 中的文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”。result = self._do_insert(cls._base_manager,using,fields,update_pk,raw)
_do_insert 869 中的文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”。using=using,raw=raw)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/manager.py”中的 manager_method 82. 返回 getattr(self.get_queryset(), name)(args, *kwargs)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/query.py”位于 _insert 1136 中。返回 query.get_compiler(using=using).execute_sql(return_id)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/sql/compiler.py”位于 execute_sql 1289 中。cursor.execute(sql, params)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”中执行 100。返回 super().execute(sql, params)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”在执行 68 中返回 self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”位于 _execute_with_wrappers 77. 返回执行器(sql、params、many、context)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”中的 _execute 85. 返回 self.cursor.execute(sql, params)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/utils.py”在出口
89。从 exc_value 引发 dj_exc_value.with_traceback(traceback)文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”中的 _execute 85. 返回 self.cursor.execute(sql, params)
文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py”在执行 296 中返回 Database.Cursor.execute(self, query, params)
异常类型:/admin/polls/question/1/change/ 处的 OperationalError 异常值:没有这样的表:main.auth_user__old
解决方案 1:
按照以下步骤轻松解决此问题:
保留 django 版本 2.1.5(此版本中解决了该问题)
pip install django==2.1.5
删除 SQLite 数据库
再次迁移
python manage.py makemigrations
然后python manage.py migrate
启动服务器
python manage.py runserver
完毕!
解决方案 2:
我刚刚自己遇到了这个问题,它看起来与https://code.djangoproject.com/ticket/29182有关。目前,您可以将 sqlite 版本降级到 2.6 之前的版本(例如 2.5.1)
解决方案 3:
只需这样做就可以解决问题:
pip install Django --upgrade
然后:
python manage.py migrate
python manage.py makemigrations app
python manage.py migrate
解决方案 4:
以下是我为解决这个问题所做的事情:
进入虚拟环境并安装
django@2.1.7
pip install django==2.1.7
删除
db.sqlite3
根文件夹中的文件。db.sqlite3
在根文件夹中创建新文件夹。重新运行迁移:
python3 manage.py makemigrations
python3 manage.py migrate
现在它应该可以正常工作了。
解决方案 5:
ALTER TABLE RENAME
该问题是由SQLite 3.26.0 中修改了该语句的行为引起的(请参阅兼容性说明)。他们还引入了该PRAGMA legacy_alter_table = ON
语句以保持与以前版本的兼容性。即将发布的Django 版本 2.1.5使用前面提到的语句作为修补程序。预计在 2019 年 1 月 1 日发布。
解决方案 6:
转到此文件夹 django/db/backends/sqlite3
备份schema.py
文件到另一个文件夹
在文本编辑器中打开原始 schema.py
你可以看到这样的代码片段
def __enter__(self):
# Some SQLite schema alterations need foreign key constraints to be
# disabled. Enforce it here for the duration of the schema edition.
if not self.connection.disable_constraint_checking():
raise NotSupportedError(
'SQLite schema editor cannot be used while foreign key '
'constraint checks are enabled. Make sure to disable them '
'before entering a transaction.atomic() context because '
'SQLite3 does not support disabling them in the middle of '
'a multi-statement transaction.'
)
self.connection.cursor().execute('PRAGMA legacy_alter_table = ON')
return super().__enter__()
注释掉它们并粘贴以下代码片段
def __enter__(self):
# Some SQLite schema alterations need foreign key constraints to be
# disabled. Enforce it here for the duration of the transaction.
self.connection.disable_constraint_checking()
self.connection.cursor().execute('PRAGMA legacy_alter_table = ON')
return super().__enter__()
这对我有用。(schema.py 的备份是为了防止工作出错;D)
了解更多信息
解决方案 7:
首先,停止服务器并删除db.sqlite3。
然后,您需要运行:
python manage.py makemigrations
python manage.py migrate
运行此命令后,您需要创建超级用户。要创建超级用户,请运行:
python manage.py createsuperuser
在此处输入超级用户详细信息。
再次运行您的服务器。
就这样。
解决方案 8:
即使升级到最新的 Django 2.2.12 并运行migrate
或官方数据库重建脚本后,我仍然遇到同样的错误__old_
:django.db.utils.IntegrityError: The row in table 'djangocms_blog_post_translation' with primary key '2' has an invalid foreign key: djangocms_blog_post_translation.master_id contains a value '2' that does not have a corresponding value in djangocms_blog_post__old.id.
这是我的黑客手段:
将数据库内容转储到sql:
sqlite3 my_db.db .dump > my_db.sql
对 SQL 输出运行正则表达式,将其替换
__old" ("id")
为" ("id") DEFERRABLE INITIALLY DEFERRED
删除旧的数据库文件
将修改后的sql加载到新的数据库中:
sqlite3 my_db.db < my_db.sql
??? & 利润
解决方案 9:
我通过将 Django 从 2.1.4 升级到 2.1.5 解决了这个问题,方法是运行
pip install --upgrade django==2.1.5
但是我不得不重新构建项目,因为这个错误似乎与我使用旧版本的 Django 插入数据库的对象有关。
更新:
无需删除整个项目,只需删除数据库即可。然后运行
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
解决方案 10:
就我而言,这是因为我的 django 版本(即 2.1)
安装更高版本(2.1.5+ 或更高版本)
删除
db.sqlite3
,以及迁移文件夹中的所有内容,但不包括__init__.py
运行以下命令:
pip install django==2.1.5 --upgrade
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
解决方案 11:
同样的事情也发生在我身上,非常令人沮丧。我在我的环境中使用 anaconda,我发现如果不立即重新安装最新版本的 sqlite,就无法删除 sqlite。尝试旧版本的 django 似乎也不起作用。对我而言,唯一有效的解决方案是使用 PostgreSQL 数据库。这当然不是理想的,但我计划在未来使用 PostgreSQL 数据库,所以这不是完全浪费时间。如果您发现自己与我处于同样的境地,那么如果您想知道如何将 PostgreSQL 数据库与您的 django 项目连接起来,这个视频可能会有所帮助。
在实际更改 settings.py 之前,您需要安装 postgreSQL 数据库,安装过程基本上就是单击所有选项上的“下一步”。但是,请记住安装过程中使用的用户名和密码。
解决方案 12:
保留 django 版本 2.1.5
This issue is adressed only in this version of Django
pip 安装 django==2.1.5
删除 SQLite 数据库
运行迁移
启动服务器 python manage.py runserver
这解决了上述问题
解决方案 13:
对于不想降级任何软件的其他人,您可以进入settings.py
文件并在DATABASES
字典中将其替换.sqlit3
为.postgresql
,然后在其正下方将其更改为db.sqlit3
。db.sql
这会将您的默认数据库切换为使用 postgreSQL。
在这样做时,您需要pip install psycopg2
。
删除您的db.sqlite3
文件(如果您有文件/不介意丢失其中的内容)以及__init__.py
应用程序迁移文件夹中除该文件之外的所有其他内容。完成所有这些操作后,您可以运行python manage.py makemigrations
Python manage.py migrate
,然后它应该可以正常工作 :)
希望我能够帮助到别人!
解决方案 14:
打开 => /YourAppFolder/migrations/您将看到迁移文件,如“ 0001_initial.py ” 删除所有这些文件。然后运行以下命令 1- python manage.py makemigrations
2-python manage.py migrate
希望它能解决您的问题
解决方案 15:
对于上述问题,解决办法是:
1)进入终端并输入pip install django==2.1.7
或最新版本的django
2)安装完成后,在终端输入python manage.py makemigrations
,然后python manage.py migrate
3)在终端中,使用代码启动服务器python manage.py runserver
4)使用密码登录管理服务器并添加产品,将成功添加产品。
解决方案 16:
我遇到了同样的问题,只是我有 2 个 sqlite 数据库和自定义数据库路由器。我设法通过将 Django 降级到 1.11.20 来使其正常工作,并且无需重新创建数据库。
解决方案 17:
你需要升级 Django,此问题已在此 PR 中修复https://github.com/django/django/pull/10733
解决方案 18:
首先,更新django版本:
pip install django --upgrade
然后
./manage.py makemigration
./manage.py migrate
./manage.py runserver
解决方案 19:
我在命令行上只做了 4 件事就解决了我的问题。
ctrl + c
(停止服务器)py manage.py makemigrations
py manage.py migrate
py manage.py runserver
(启动服务器)
解决方案 20:
对于那些无法通过上述答案解决此错误的人,如果您使用“main”名称创建了应用程序,则此错误可能是由于应用程序名称相同而导致的。因此请尝试将应用程序名称“main”更改为其他名称。
解决方案 21:
我通过更改一些模型解决了这个问题。我有一个名为 project 和一个名为 projects。数据库表混乱了,并抛出了这个错误。
解决方案 22:
我已经使用以下方法解决了这个问题:
1)删除db.sqlit3
2)应用程序目录删除
pycache中的所有内容
3)manage.py makemigrations、manage.py migration、manage.py createsuperuser 然后 manage.py runserver。
解决方案 23:
我遇到了同样的问题,并通过执行以下操作解决了它:
1)获取最新django
版本
2)获取最新SQL Lite
版本
db.sqlite3
3)从项目中删除文件
4) 做一些小的改变models.py
(例如改变字段的大小)
db.sqllite3
5)通过运行makemigrations
&生成一个新文件migrate commands
6)将新创建的db.sqllite3
文件导入SQL Lite
解决方案 24:
我安装/降级了 django 到 2.2 版本,删除了 django 3.x
pip install django==2.2
然后我删除了 db.sqlite 文件,然后
我试过
python manage.py makemigrations,
python manage.py migrate
python manage.py creatingsuperuser.
解决方案 25:
升级 Django
pip install Django --upgrade
删除
db.sqlite3
项目根文件夹中的文件。通过重新运行迁移在根文件夹中创建新的 db.sqlite3。
python3 manage.py makemigrations
迁移
python3 manage.py migrate
它可能只适用于此,或者如果它被删除,您可能需要创建一个新的超级用户。
使用以下方法检查您的超级用户
python manage.py shell
from django.contrib.auth.models import User
User.objects.filter(is_superuser=True)
如果<QuerySet []>
出现则表示没有用户。否则检查您的用户是否存在。
如果您的用户不存在,请使用以下命令创建一个
python manage.py createsuperuser
解决方案 26:
步骤:
从您的 ENV 中卸载当前的 Django。只需删除文件夹“anaconda3/envs/yourenv/lib/python3.7/site-packages/Django allversions”。
注意:仅适用于 Anaconda 用户,其他用户应该弄清楚如何从您的 ENV 中卸载软件包。
将 repo 下载为 zip 文件。
解压 zip。
切换到你的 ENV。
进入解压的文件夹。
运行
"python setup.py install"
并安装 Django。删除以前的
db.sqlite3
文件。现在再次应用迁移来创建新db.sqlite3
文件。
注意:我不知道如何修复以前的 dbfile 并防止数据丢失。所以如果你知道的话请告诉我。
运行服务器。
恭喜!现在一切正常。
从官方 Django 版本更新到一月份的最新 django。
解决方案 27:
请检查您是否没有从应用程序中删除迁移文件夹,如果已删除,请尝试恢复该文件夹并删除迁移文件,或者如果永久删除,请创建应用程序并复制粘贴您的工作并
然后
1. Delete db.sqlite3
2. python manage.py makemigrations
3. python manage.py migrate
4. python manage.py createsuperuser
哈哈哈:)
解决方案 28:
删除db.sqlite3
makemigrations和迁移
创建新的超级用户
这对我有用
解决方案 29:
注意:如果你在 Sqlite3 DB 中有一些个人数据,请不要使用此技巧,因为你将删除 Sqlite3 DB
我知道这个问题有很多答案,但只有这个技巧能帮助我解决这个问题,因为我是 Python 初学者,正在学习Django。
停止运行 django 网络服务器,Ctrl-C
删除 db.sqlite3
卸载 Django 旧版本
使用“pip install django”安装最新版本的 Django
删除项目所有应用的所有迁移
现在在终端中运行这些命令
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
(提供超级用户凭证)python manage.py runserver
现在最终使用更新的超级用户凭据登录管理面板并尝试添加记录。
有人在此链接中提出了同样的建议
解决方案 30:
django-2.2.7
这对我有用-
1) 删除db.sqlite3。2
) 在每个应用程序中,在migrations文件夹中,删除__init__.py之外的所有内容。3
) 在每个应用程序中,删除pycache文件夹。
我不确定您是否必须对所有应用程序或仅对相关应用程序执行此操作,但这对我来说有效。
扫码咨询,免费领取项目管理大礼包!