【发布时间】:2018-09-05 07:01:46
【问题描述】:
我最近开始收到一个错误,我无法识别使用 SQLite 的 Django 项目。下面链接的项目是/以前兼容 Python 2/3,尽管我主要使用 Python 2 运行它。最近,我将我的大多数计算机和项目切换为默认使用 Python 3(我知道,迟到总比没有好,对?)。此外,我将项目从 Django 1.7 升级到 1.11。此后,项目开始收到table already exists 错误,但仅在使用python3 运行migrate 命令时。
我也仅在运行python3 manage.py migrate 时遇到错误。例如,python3 manage.py test 工作得很好,这有点令人困惑,因为 test 首先运行了迁移。运行python2 manage.py migrate 工作正常,没有错误。
我正在运行 Python 3.6.4,通过 Homebrew 在 Mac 上安装,我收到的错误是:
File "/usr/local/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 59, in ensure_schema
raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc)
django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table (table "django_migrations" already exists)
我在多台计算机上遇到了完全相同的问题——在 Python 3 中被破坏,但在 Python 2 中工作——所以我想其他任何人都会看到同样的问题。您应该能够通过以下步骤重现该问题:
git clone git@github.com:alexdlaird/django-bootstrap-authentication-template-project.git && cd django-bootstrap-authentication-template-projectmake install-
python2 manage.py migrate- 请注意,它工作得很好 -
rm db.sqlite重新开始 -
python3 manage.py migrate- 请注意,它失败并出现上面显示的错误 5倍。rm db.sqlite重新开始 5倍。python3 manage.py test- 请注意,它工作得很好
要查看针对 MySQL 实例运行的迁移(该项目假设您有一个默认的 Homebrew MySQL 实例在本地运行,但如果没有,则可以在 .env 中配置),运行 python3 manage.py migrate 并观察它工作得很好使用 Python 2 或 3,因此问题似乎与 SQLite 迁移无关。
有什么想法吗?我在这里做错了什么?
-- .pyc 更新 --
我在运行上述命令之间执行了find . -name \*.pyc -delete,但这并不能缓解这种情况。这是有道理的,因为这个问题在新克隆上仍然存在,但我认为我们可以消除它是 Python 缓存文件的问题。
【问题讨论】:
-
鉴于这里缺乏吸引力,以及我所做的一些额外调试让我非常有信心这是与 Python 3.x 和 Django 1.10 及更高版本相关的错误,我已经提交了一个问题Django 用户邮件列表如下。当我在那里得到回复时,我会更新这个问题。 groups.google.com/forum/#!topic/django-users/iUGQpqPEltg
-
我已经对这个问题做了一些调试,在 2.7 和 3.6 之间来回切换。我所看到的似乎是这个问题与表名有关——可能与 unicode 有关。例如,在
python3.6/django/db/backends/sqlite3/introspection.py的值中查看返回的get_tables_list会显示一个空列表(我相信是因为字符串前面的 b'' 会劫持原本应该是数组索引的内容),而在同一个文件中和 2.7 中的功能所有现有表都正确返回。
标签: python django python-3.x sqlite python-3.6