Django-没有这样的表:main.auth_user__old


82

我遵循的是官方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.XFrame” ']

追溯:

_execute 85中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”。return self.cursor.execute(sql,params)

执行296中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py”。return Database.Cursor.execute(self,query,参数)

上面的异常(没有这样的表:main.auth_user__old)是以下异常的直接原因:

内部34中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/core/handlers/exception.py”。response = get_response(request)

_get_response 126中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/core/handlers/base.py”。response = self.process_exception_by_middleware(e,request)

_get_response 124中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/core/handlers/base.py”。response =包装的回调(请求,* callback_args,** callback_kwargs)

包装器604中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”。return 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)

_wrapped_view_func 44中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/views/decorators/cache.py”。response = view_func(request,* args,** kwargs)

内部223中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/sites.py”。返回视图(请求,* args,** kwargs)

在change_view 1640中,文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”。return self.changeform_view(请求,object_id,form_url,extra_context)

_wrapper 45中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/utils/decorators.py”。return 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)

在changeform_view 1525中,文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/options.py”。返回self._changeform_view(请求,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(请求,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,

log_action 35中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/contrib/admin/models.py”。change_message = change_message,

在manager_method 82中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/manager.py”。return getattr(self.get_queryset(),name)(* args,** kwargs)

创建413中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/query.py”。obj.save(force_insert = True,使用= self.db )

保存718中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”。force_update = force_update,update_fields = update_fields)

在save_base 748中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”。更新= self._save_table(原始,cls,force_insert,force_update ,使用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,使用,字段,update_pk(原始)

_do_insert 869中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”。using = using,raw = raw)

在manager_method 82中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/manager.py”。return getattr(self.get_queryset(),name)(* args,** kwargs)

_insert 1136中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/query.py”。return query.get_compiler(using = using).execute_sql(return_id )

在execute_sql 1289中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/sql/compiler.py”。cursor.execute(sql,params)

在执行100中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”。return super()。execute(sql,params)

执行68中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”。返回self._execute_with_wrappers(sql,params,many = False, executor = self._execute)

_execute_with_wrappers 77中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”。返回执行程序(sql,params,很多,上下文)

_execute 85中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”。return self.cursor.execute(sql,params)

出口 89中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/utils.py” 。从exc_value提高dj_exc_value.with_traceback(traceback)

_execute 85中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”。return self.cursor.execute(sql,params)

执行296中的文件“ /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py”。return Database.Cursor.execute(self,query,参数)

异常类型:/ admin / polls / question / 1 / change /处的OperationalError异常值:无此类表:main.auth_user__old


如果没有数据,只需将其删除并再次迁移即可。如果不能,做python manage.py showmigrations,看看哪些迁移没有这样做
seuling

Answers:


52

我自己碰到了这个问题,它似乎与https://code.djangoproject.com/ticket/29182有关。现在,您只需将sqlite版本降级到2.6之前的版本(例如2.5.1)


7
现在已提交针对此问题的修复程序,它将包含在下一个发行版2.1.5(预期于2019年1月1日)和2.0.10(发行日期TBD)中。
阿拉斯代尔

7
将macOS系统sqlite3降级不是那么容易,还是我在这里错过了一些东西?我的解决方法是安装github / master django(已修复此问题)。
Alper

1
@Alper我卸载了当前的django,然后从GitHub安装了django。该错误仍然存​​在,并且我无法在macOS上降级sqlite3(例如,使用brew install sqlite3@3.25.1)任何想法?
Hatzil

5
更新后,请确保删除数据库并使用migrations命令重建它。
米茨霍尔(Mitsjol)'18

9
@Alvaro的BUG在Django 2.1.5
塞尔丘克

49

轻松维护以下步骤即可摆脱此问题:

  1. 保留Django 2.1.5版(此版本中解决的问题) pip install django==2.1.5
  2. 删除SQLite数据库
  3. 再次迁移python manage.py makemigrations,然后python manage.py migrate
  4. 启动服务器 python manage.py runserver

完成!


1
这将完美地工作,但是假设您不想删除sqlite db文件?
菲利普·穆图瓦

1
即使不删除sqlite db,它也可以工作(但仍可以迁移)。我正在使用2.0.4进行旧项目开发
izzulmakin

谢谢,这很好。我正在使用2.0.7版,并且在将数据保存到管理员时遇到问题。
xreyc_developer22

13

这样做并解决了问题:

pip install Django --upgrade

然后:

python manage.py migrate

python manage.py makemigrations app

python manage.py migrate

10

该问题是由ALTER TABLE RENAMESQLite 3.26.0中语句的修改行为引起的(请参阅兼容性说明)。他们还介绍了该PRAGMA legacy_alter_table = ON语句,以保持与以前版本的兼容性。即将发布的Django 2.1.5版本利用了前面提到的语句作为修补程序。预计于2019年1月1日发布。


10

这是我为解决此问题所做的工作:

  1. 转到虚拟环境并安装 django@2.1.7

    pip install django==2.1.7
    
  2. 删除db.sqlite3根文件夹中的文件。

  3. db.sqlite3在您的根文件夹中创建新的。
  4. 重新运行迁移:

    python3 manage.py makemigrations
    
    python3 manage.py migrate
    

现在它应该可以正常工作。


关键是“删除根文件夹中的db.sqlite3文件”〜运行python3 manage.py makemigrations将创建新的sqlite3文件。
杰罗姆(Jerome)

出于某些原因,删除sqlite不仅起作用,我还尝试了删除pycache +迁移(我正在学习Django),然后它对我有用。
Anshuman Kumar

9

转到此文件夹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)

了解更多信息

https://github.com/django/django/pull/10733/commits/c8ffdbe514b55ff5c9a2b8cb8bbdf2d3978c188f#diff-0c8f495bfee773ab7b5409533bd6d7ef


我在django 1.11上使用了此修复程序,只是我只需要在“ c.execute('PRAGMA foreign_keys = 0')”之后添加“ c.execute('PRAGMA legacy_alter_table = ON')”行,并对其进行了修复。
n00b

2
我在需要django 2.0.7的教程中。此解决方案有效:)
Bisonbleu

@Bisonbleu我想我在同一教程的中间。但是该解决方案对我不起作用。你能详细说明你做了什么吗?
code_life

2
@Namal Jayasundara的答案中建议的@unathletic_coder,我在第21行的/project_name/lib/python3.7/site-packages/django/db/backends/sqlite3/schema.py中以def __enter __(self)开头,并用建议的3行代码替换了现有代码。我在做youtube.com/watch?v=F5mRW0jo-U4
Bisonbleu

6

我通过将Django从2.1.4升级到2.1.5解决了问题,但是我不得不重新构建项目,因为该错误似乎与使用旧版Django插入数据库中的对象有关。


1
在这种情况下,在足以容纳新django的地方进行migration和makemigrations命令。
Pravin RGMishra

5

对我来说,这是从我的Django版本(即2.1)安装的更高版本(出于某些原因,我使用2.1.5)**删除db.sqlite3,以及迁移文件夹中除init .py run命令之外的所有内容:

pip install django==2.1.5 --upgrade
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

4

我也发生了同样的事情,非常沮丧。我在自己的环境中使用anaconda,但发现如果不立即重新安装最新版本的sqlite,就无法删除sqlite。尝试使用较旧版本的django似乎也不起作用。对我而言唯一有效的解决方案是使用PostgreSQL数据库。这当然不是理想的选择,但是我计划将来使用PostgreSQL数据库,因此这不会完全浪费时间。如果您发现自己和我以前在同一地方,那么如果您想知道如何将PostgreSQL数据库与django项目连接起来,那么该视频可能会有所帮助。

您需要先安装postgreSQL数据库,然后才能在settings.py中进行实际更改,安装更多的是在所有选项上单击“下一步”。但是,请记住在安装过程中使用的用户名和密码。


4
  1. 首先,停止服务器并删除db.sqlite3。
  2. 然后,您需要运行:python manage.py makemigrations python manage.py migration
  3. 运行此命令后,您需要创建超级用户。要创建超级用户,请运行:python manage.py createsuperuser在此输入超级用户的详细信息。
  4. 再次运行服务器。

妳去


3

对于以上问题和解决方法是:

1)进入终端并输入 pip install django==2.1.7django或最新版本

2)安装完成后,在终端输入 python manage.py makemigrations,然后python manage.py migrate

3)在终端中,用代码启动服务器 python manage.py runserver

4)使用密码登录到管理服务器并添加产品,它将成功添加产品。


欢迎使用Stack Overflow!请披露任何隶属关系,请勿将网站用作通过发布来推广您的网站的方式。请参阅我如何写一个好的答案?

2

对于不希望降级任何软件的其他软件,您可以进入settings.py文件,然后在DATABASESdict中将其替换.sqlit3.postgresql,然后在其下方将更db.sqlit3改为db.sql。这会将您的默认数据库切换为使用postgreSQL。

为此,您需要pip install psycopg2

删除您的db.sqlite3文件(如果您不想丢失其中的文件),则删除__init__.py应用程序迁移文件夹中所有非文件的文件。完成所有这些操作后,就可以运行python manage.py makemigrations和pythonmanage.py migrate,然后它应该可以工作了:)

希望我能帮助别人!


2
为此,还需要安装PostgreSQL,以便对所有在完成所有操作后仍无法弄清为什么出现连接错误的人起作用。:)
Gilbert

是psycopg2不是PostgreSQL吗?原因可以解释为什么它不会为我启动服务器哈哈
Ziiik

2
AFAIK psycopg2是使Python与PostgreSQL对话的适配器,但是PostgreSQL需要单独安装。注意:我是Django的新手,所以我随便说些什么都可以。
吉尔伯特

2

打开=> / YourAppFolder / migrations /您将看到正在迁移的文件,就像' 0001_initial.py '删除所有这些文件一样。并运行以下命令1- python manage.py makemigrations 2-python manage.py migrate 希望它必须解决您的问题


1
最后,问题与之无关,但感谢您抽出宝贵的时间!
NorthernSage

2

即使升级到最新的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.

这是我的技巧:

  1. 将数据库内容转储到sql: sqlite3 my_db.db .dump > my_db.sql
  2. 在sql输出上运行正则表达式,替换__old" ("id")" ("id") DEFERRABLE INITIALLY DEFERRED
  3. 删除旧的数据库文件
  4. 将修改后的sql加载到新数据库中: sqlite3 my_db.db < my_db.sql
  5. ??? 和利润

1

脚步:

  1. 从您的ENV卸载当前的Django。只需删除文件夹“ anaconda3 / envs / yourenv / lib / python3.7 / site-packages / Django所有版本。” *注意:仅对于Anaconda用户,其他用户应了解如何从ENV卸载软件包。

  2. 前往Github.com/django/django。

  3. 将回购文件下载为zip文件。

  4. 解压缩。

  5. 切换到您的ENV。

  6. 输入解压缩的文件夹。

  7. 运行“ python setup.py install”并安装Django。

  8. 删除以前的db.sqlite3文件。现在,再次应用迁移以创建新的db.sqlite3文件。

*注意:我不知道如何修复以前的dbfile并防止数据丢失。所以,请告诉我您是否知道。

  1. 运行服务器。

恭喜!现在工作正常。

从官方Django版本在一月更新到最新的django。



1

对于无法通过以上答案解决此错误的用户,如果您将应用程序命名为“ main”,则可能由于相同的应用程序名称问题而导致此错误。因此,尝试将您的应用程序名称“ main”更改为另一个。



1

我通过更改一些模型解决了这个问题。我有一个命名项目和一个命名项目。数据库表感到困惑,并向我抛出此错误。


1

我已经使用以下方法解决了这个问题:

1)删除db.sqlit3

2)应用程序的目录删除pycache中的所有 内容

3)manage.py makemigrations,manage.py迁移,manage.py createsuperuser,然后manage.py运行服务器。


1

我遇到了相同的问题,并通过以下操作解决了该问题:

1)获取最新django版本

2)获取最新SQL Lite版本

3)db.sqlite3从您的项目中删除文件

4)对models.py(进行更改)(例如,更改字段的大小)

5)db.sqllite3通过运行makemigrations&生成一个新文件migrate commands

6)将新创建的db.sqllite3文件导入到SQL Lite


1

我将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. 

1

更新django版本:pip install django --upgrade然后

./manage.py makemigration
./manage.py migrate
./manage.py runserver


0

我在命令行上只做了4件事,它修复了我的问题。

  1. ctrl + c (停止服务器)
  2. py manage.py makemigrations
  3. py manage.py migrate
  4. py manage.py runserver (启动服务器)

1
该问题已通过2.1.5点发行版(发行说明的“ Bugfixes会话”中的票号#29182)得到解决。docs.djangoproject.com/en/2.1/releases/2.1.5/# bugfixes
NorthernSage

0

django-2.2.7
这对我有用-

1)删除db.sqlite3
2)在每个应用程序的migrations文件夹中,删除__init__.py以外的所有内容。
3)在每个应用程序中,删除__pycache__文件夹。

我不确定您是否必须对所有应用程序还是仅对相关应用程序执行此操作,但这对我有用。


删除migrations文件是解决此类问题的值得实践。@rajvijay
鲸鱼52Hz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.