即使在运行迁移后,Django Programming错误列也不存在

Ale*_*lla 13 django django-migrations

我跑了python manage.py makemigrations,我得到:没有检测到任何变化然后,python manage.py migrate我得到:没有适用的迁移.

然后,我尝试将更改推送到生产:git push heroku master一切都是最新的

然后,在生产中,我重复命令:heroku run python manage.py migrate不应用任何迁移.

为了以防万一,我makemigrations在生产中运行:

heroku run python manage.py makemigrations
No changes detected
Run Code Online (Sandbox Code Playgroud)

为什么我得到一个

ProgrammingError at ....

column .... does not exist
Run Code Online (Sandbox Code Playgroud)

"未检测到任何更改"表示数据库与代码一致.我该怎么调试呢?

Yah*_*oui 13

我遇到了同样的问题(列不存在)但是当我尝试不运行migratemakemigrations

  • 原因:我删除了迁移文件,并在运行上次更改的迁移之前将其替换为单个假装初始迁移文件0001

  • 解:

    1. 删除涉及该应用程序迁移的表(如果有的话,考虑备份解决方法)
    2. django_migrations记录迁移的表中删除负责迁移该应用程序的行,这就是Django如何知道哪些迁移已应用以及哪些仍需要应用.

以下是如何解决这个问题:

  • 以postgres用户身份登录(我的用户名为posgres):

    sudo -i -u postgres

  • 打开一个sql终端并连接到您的数据库:

    psql -d database_name

  • 列出您的表格并找出与该应用程序相关的表格:

    \dt

  • 删除它们(考虑关系下降顺序):

    DROP TABLE tablename ;

  • 列出迁移记录,您将看到应用的迁移分类如下:

id | app | 名字| 应用
- + ------ + -------- + --------- +

SELECT * FROM django_migrations;
Run Code Online (Sandbox Code Playgroud)
  • 删除该应用的迁移行(您可以按ID或应用删除,应用不要忘记'引号'):

    DELETE FROM django_migrations WHERE app='yourapp';

  • 注销并仅运行迁移(可能在您的情况下运行makemigrations):

    python manage.py migrate --settings=your.settings.module_if_any

注意:在您的情况下,可能不必删除该应用程序的所有表,也不必删除所有迁移,只有导致问题的模型.

我希望这可以提供帮助.

  • 有同样的问题。删除表并在 heroku 控制台中重新运行迁移解决了这个问题。谢谢 ! (2认同)
  • `DROP TABLE tablename ;` 会删除应用程序中的所有数据,对吗? (2认同)

zub*_*hav 9

Django迁移记录在数据库的"django_migrations"表下.这就是Django如何知道哪些迁移已经应用以及哪些仍然需要应用.

查看数据库中的django_migrations表.应用迁移时可能出现问题.因此,删除表中具有与该列"不存在"相关的迁移文件名的行.然后,尝试重新运行迁移.

  • 您为什么不使用回滚功能?我天真地尝试了一下,最终出现了一个依赖项历史记录错误,并从我刚刚创建的备份中恢复了。请谨慎使用。 (2认同)

小智 6

我有一个类似的问题 - 当我单击 django-admin 站点上的模型时出现错误消息。我通过注释掉models.py 中的字段,然后运行迁移来解决它。在此之后,我取消对该字段的注释并重新运行迁移。之后,错误消息消失了。

  • 我删除了所有迁移文件,注释掉也对我有用。 (2认同)

小智 6

这是我尝试过的并且有效:

  • 去手动添加列到你的表
  • 运行 python manage.py makemigrations
  • 返回删除您添加的那列
  • 运行 python manage.py migrate


Dav*_*han 5

我的案例可能有点晦涩,但如果它对某人有帮助,那么值得在这里记录。

我在其中一个迁移中调用了一个函数,该函数定期导入所述迁移的模型,即

from myApp.models import ModelX
Run Code Online (Sandbox Code Playgroud)

在迁移中导入模型的唯一方法是使用 RunPython:

def myFunc(apps, schema_editor): 
    MyModel = apps.get_model('myApp 'MyModel')
Run Code Online (Sandbox Code Playgroud)

然后像这样调用该函数:

class Migration(migrations.Migration):
    operations = [
        migrations.RunPython(initialize_mhs, reverse_code=migrations.RunPython.noop),
    ]
Run Code Online (Sandbox Code Playgroud)

此外,原始导入一直有效,直到我在以后的迁移中修改了模型,这使得该错误更难定位。