我正在关注官方 Django 文档中的 first app tutorial,并在尝试保存通过管理页面所做的一些更改时收到此错误。我对此进行了一些研究,但是我能够找到的可能的解决方案(例如迁移数据库)根本行不通。如果您想查看我的代码的某些特定部分,请告诉我。
以下是错误:
/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" in _execute 85. return self.cursor.execute(sql, params) File "/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/网站包/ django/db/backends/sqlite3/base.py" in execute 296. return Database.Cursor.execute(self, query, params) 上述异常(没有这样的表:main.auth_user__old)是以下异常的直接原因:内部 34 中的文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/core/handlers/exception.py”。响应= get_response(请求)文件“/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) 文件“/Users/gfioravante/Projects/test_app /ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”在包装器 604 中。返回 self.admin_site.admin_view(view)(*args, **kwargs) 文件“/Users/gfioravante /项目/test_app/ta_env/lib/p ython3.7/site-packages/django/utils/decorators.py" 在 _wrapped_view 142. 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" in _wrapper 45. return bound_method(*args, **kwargs) File "/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/ django/utils/decorators.py" 在 _wrapped_view 142. response = view_func(request, *args, **kwa rgs)文件“/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) 文件 "/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py" 在 _changeform_view 1571. self.log_change(request, new_object, change_message) 文件log_change 826 中的“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”。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. return getattr(self.get_queryset(), name)(*args, **kwargs) File "/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/模型/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. 更新 = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 文件 "/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/ _save_table 831 中的模型/base.py”。结果 = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages /django/db/models/base.py" 在 _do_insert 869. using=using, raw=raw) 文件 "/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/ models/manager.py" in manager_method 82. return getattr(self.get_queryset(), name)(*args, **kwargs) File "/Users/gfio ravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/query.py" in _insert 1136. return query.get_compiler(using=using).execute_sql(return_id) File "/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. return super().execute(sql, params) File "/Users/gfioravante/Projects/ test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py" 在执行 68. return 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" in _execute_with_wrappers 77. return executor(sql, params, many, context) File "/Users/ gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py" in _execute 85. ret urn self.cursor.execute(sql, params) File "/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/utils.py" 在出口 89. raise dj_exc_value.with_traceback (追溯)来自 _execute 85 中的 exc_value 文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”。返回 self.cursor.execute(sql ,参数)文件“/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py”在执行296。返回Database.Cursor.execute(self ,查询,参数)异常类型:OperationalError at /admin/polls/question/1/change/ 异常值:没有这样的表:main.auth_user__old
python manage.py showmigrations
以查看哪些迁移未完成
轻松摆脱此问题,维护以下步骤:
保持 django 版本 2.1.5(该版本解决的问题) pip install django==2.1.5 删除 SQLite db 再次迁移 python manage.py makemigrations 然后 python manage.py migrate 启动服务器 python manage.py runserver
完毕!
我自己也遇到过这个,它看起来与https://code.djangoproject.com/ticket/29182有关。现在,您可以将您的 sqlite 版本降级到 2.6 之前的版本(例如 2.5.1)
刚刚这样做,它解决了问题:
pip install Django --upgrade
然后:
python manage.py migrate
python manage.py makemigrations app
python manage.py migrate
这是我为解决此问题所做的工作:
进入虚拟环境安装django@2.1.7 pip install django==2.1.7 删除根文件夹下的db.sqlite3文件。在根文件夹中创建新的 db.sqlite3。重新运行迁移:python3 manage.py makemigrations python3 manage.py migrate
现在它应该可以正常工作了。
该问题是由 SQLite 3.26.0 中 ALTER TABLE RENAME
语句的修改行为引起的(请参阅 compatiblity note)。他们还引入了 PRAGMA legacy_alter_table = ON
语句以保持与以前版本的兼容性。即将发布的 Django release 2.1.5 使用前面提到的语句作为修补程序。预计在 2019 年 1 月 1 日。
转到此文件夹 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)
了解更多信息
首先,停止服务器并删除 db.sqlite3。然后,您需要运行: python manage.py makemigrations python manage.py migrate 运行此命令后,您需要创建超级用户。要创建超级用户,请运行: python manage.py createsuperuser 在此处输入超级用户详细信息。再次运行您的服务器。
你去吧。
对我来说,它来自我的 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
我通过运行将 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
即使在升级到最新的 Django 2.2.12 并运行 migrate
或 official database rebuild script 之后,我仍然遇到与 __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 ??? & 利润
同样的事情也发生在我身上,非常令人沮丧。我在我的环境中使用 anaconda,我发现如果不立即重新安装最新版本的 sqlite 就无法删除 sqlite。尝试旧版本的 django 似乎也不起作用。唯一对我有用的解决方案是使用 PostgreSQL 数据库。这当然不理想,但我计划在未来使用 PostgreSQL 数据库,所以这并不是完全浪费时间。如果您发现自己和我在同一个地方,那么如果您想知道如何将 PostgreSQL 数据库与您的 django 项目连接起来,那么这个 video 可能会有所帮助。
在实际更改 settings.py 之前,您需要安装 postgreSQL 数据库,安装更多的是在所有选项上单击 Next。但是,请记住您在安装过程中使用的用户名和密码。
打开=> /YourAppFolder/migrations/您会看到迁移文件就像“0001_initial.py”一样删除所有这些文件。并运行以下命令 1- python manage.py makemigrations
2- python manage.py migrate
希望,它必须解决您的问题
针对上述问题及解决方案是:
1) 转到终端并输入 pip install django==2.1.7
或最新版本的 django
2) 安装完成后,在终端输入python manage.py makemigrations
,然后输入python manage.py migrate
3) 在终端中,使用代码 python manage.py runserver
启动服务器
4) 使用密码登录管理服务器并添加产品,即可成功添加产品。
对于不想降级任何软件的其他人,您可以进入您的 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
,然后它应该可以工作了 :)
希望我能帮助别人!
保持 django 版本 2.1.5
This issue is adressed only in this version of Django
pip install django==2.1.5
删除 SQLite 数据库
运行迁移
启动服务器 python manage.py runserver
这样就解决了上面的问题
我在命令行上只做了 4 件事,它修复了我的问题。
ctrl + c (停止服务器) py manage.py makemigrations py manage.py migrate py manage.py runserver (启动服务器)
除了我有 2 个 sqlite 数据库和自定义数据库路由器之外,我遇到了同样的问题。我设法通过将 Django 降级到 1.11.20 来使其工作,并且无需重新创建数据库。
对于那些无法通过上述答案解决此错误的人,如果您将应用程序命名为“main”,则可能会由于相同的应用程序名称问题而发生此错误。因此,尝试将您的应用名称“main”更改为另一个。
我通过改变我的一些模型解决了这个问题。我有一个命名项目和一个命名项目。数据库表很困惑,并向我抛出了这个错误。
我已经使用以下方法解决了这个问题:
1)删除db.sqlit3
2)应用程序的目录删除pycache中的所有内容
3)manage.py makemigrations,manage.py migrate,manage.py createsuperuser,然后manage.py runserver。
我遇到了同样的问题并通过执行以下操作修复了它:
1) 获取最新的 django
版本
2) 获取最新的 SQL Lite
版本
3) 从您的项目中删除 db.sqlite3
文件
4) 对 models.py
进行小改动(例如更改字段的大小)
5) 通过运行 makemigrations
& 生成一个新的 db.sqllite3
文件migrate commands
6) 将新创建的 db.sqllite3
文件导入 SQL Lite
我将 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.
升级 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 创建一个
首先,更新django版本:
pip install django --upgrade
然后
./manage.py makemigration
./manage.py migrate
./manage.py runserver
脚步:
从你的 ENV 中卸载当前的 Django。只需删除文件夹“anaconda3/envs/yourenv/lib/python3.7/site-packages/Django 所有版本.. 注意:仅对于 Anaconda 用户,其他用户应弄清楚如何从您的 ENV 中卸载包。转到 https ://github.com/django/django.下载repo为zip文件.解压zip.切换到你的ENV.进入解压后的文件夹.运行“python setup.py install”并安装Django.删除你以前的db.sqlite3文件. 现在再次应用迁移以创建一个新的 db.sqlite3 文件。注意:我不知道如何修复以前的 dbfile 并防止数据丢失。所以如果你知道请告诉我。运行服务器。
恭喜!它现在工作正常。
从官方 Django 版本更新到 1 月份的最新 django。
请检查您是否尚未从您的应用程序中删除迁移文件夹如果已删除尝试恢复该文件夹并删除迁移文件,或者如果删除永久创建应用程序并复制粘贴您的工作和
然后
1. Delete db.sqlite3
2. python manage.py makemigrations
3. python manage.py migrate
4. python manage.py createsuperuser
HTH :)
删除 db.sqlite3 makemigrations & migrate 创建新的超级用户
这对我有用
注意:如果您在 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
现在终于使用更新的超级用户凭据登录到管理面板并尝试添加记录。
有人在此 link 上提出了相同的建议
django-2.2.7 这对我有用-
1)删除db.sqlite3。 2) 在每个应用程序的迁移文件夹中,删除除 __init__.py 之外的所有内容。 3)在每个应用程序中,删除 __pycache__ 文件夹。
我不确定您是否必须为所有应用程序或仅针对相关应用程序执行此操作,但这对我有用。
migrations
文件是解决此类问题的值得实践的方法。 @rajvijay
pip install --upgrade django==2.1.5
然后我使用python manage.py makemigrations
然后python manage.py migrate
然后我使用python manage.py runserver
就像一个魅力,我不必删除 db!