【问题标题】:`table "django_migrations" already exists` error with Python 3 and SQLite3`table "django_migrations" 已经存在`Python 3 和 SQLite3 的错误
【发布时间】: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 中工作——所以我想其他任何人都会看到同样的问题。您应该能够通过以下步骤重现该问题:

  1. git clone git@github.com:alexdlaird/django-bootstrap-authentication-template-project.git && cd django-bootstrap-authentication-template-project
  2. make install
  3. python2 manage.py migrate - 请注意,它工作得很好
  4. rm db.sqlite 重新开始
  5. 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


【解决方案1】:

终于找到了。对于可能遇到类似问题的其他人,这是我的项目中我必须删除的违规行:https://github.com/alexdlaird/django-bootstrap-authentication-template-project/commit/db16ff88d0d6c25eed38e52bd8332c721ed21e2f?diff=split#diff-e398a065684e871bec35f76ea80f20a7

这是用于 Python 2.5/6 和 SQLite(参见 here)的古老 hack 的产物——它绝不是一个好的解决方案,但鉴于 SQLite 仅用于开发和测试,它工作得很好.这肯定比连续几个小时对 Python 2/SQLite unicode 不兼容问题猛烈抨击要好。

毫不奇怪,我很久以前就忘记了这个 hack,直到我调试 Django 代码(在the comment above 中描述)并意识到为什么字符串表名称有丑陋的字节包装器时,我才想到它。

【讨论】:

    【解决方案2】:

    在每次尝试之前清除您的 django 迁移缓存。

    find . -path "*/migrations/*.pyc"  -delete
    

    【讨论】:

    • 没有骰子。我也从干净的克隆中尝试过很多次,所以这并不奇怪。好主意!
    • JFI ,如果你运行 python3 manage.py migrate 是否有效?
    • 不。我已经在我的应用程序以及清理和尝试首先预运行 Django 的应用程序迁移(例如,会话或它们的“身份验证”迁移)中尝试了这一点。所有迁移都会收到相同的错误。
    猜你喜欢
    • 2016-11-28
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多