即使在 运行 次迁移之后,Django 编程错误列也不存在

Django Programming error column does not exist even after running migrations

我 运行 python manage.py makemigrations 我得到: 未检测到任何变化 然后, python manage.py migrate 我得到: 没有要应用的迁移。

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

然后,在生产中,我重复命令: heroku 运行 python manage.py 迁移 没有要应用的迁移。

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

heroku run python manage.py makemigrations
No changes detected

为什么然后我得到

ProgrammingError at ....

column .... does not exist

"No changes detected"表示数据库与代码一致。 我该如何调试?¡?

Django 迁移记录在您的数据库中 'django_migrations' table 下。这就是 Django 知道哪些迁移已经应用以及哪些仍然需要应用的方式。

查看您的数据库中的 django_migrations table。应用迁移时可能出现问题。因此,删除 table 中具有与 'does not exist' 列相关的迁移文件名的行。然后,尝试重新运行一次迁移。

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

我遇到了同样的问题(列不存在)但是当我尝试 运行 migrate 而不是 makemigrations 时(我相信这是同一个问题)

  • 原因:在运行最后一次更改的迁移

  • 之前,我删除了迁移文件并用单个假装初始迁移文件 0001 替换了它们
  • 解法:

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

解决这个问题的方法如下:

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

    sudo -i -u postgres

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

    psql -d database_name

  • 列出您的 table 并找出与该应用相关的 table:

    \dt

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

    DROP TABLE tablename ;

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

id | app | name | applied
--+------+--------+---------+

SELECT * FROM django_migrations;
  • 删除该应用的迁移行(可以按id删除,也可以按应用删除,带应用的别忘了'quotes'):

    DELETE FROM django_migrations WHERE app='yourapp';

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

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

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

希望这对您有所帮助。

所以,我总是 运行 遇到这种问题,所以今天我决定尝试在数据库级别解决它。事情是,我更改了一个模型字段名称,Django 没有在迁移文件中反映出来。我是后来 运行 遇到问题时才发现的。后来我查看了迁移文件,发现没有针对该更改的迁移。但是我没有注意到,因为我也进行了其他更改,所以一旦看到迁移文件我就很高兴。 我的建议。一次为每个更改创建一个迁移。这样你就可以看到它是否发生了。

所以这是我在 MySQL 中完成的工作。

打开 mysql 控制台。

show databases; # see all my dbs. I deleted a few
drop database <db-name>; # if needed
use <db-name>; # the database name for your django project
show tables; # see all tables in the database
DESCRIBE <table-name>; # shows columns in the database
SHOW COLUMNS FROM <db-name>; # same thing as above
ALTER TABLE <table-name> CHANGE <old-column-name> <new-column-name> <col-type>; # now I manually updated my column name

如果您使用的是 postgresql,只需 google 相应的命令。

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

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

from myApp.models import ModelX

在迁移中导入模型的唯一方法是使用例如运行Python:

def myFunc(apps, schema_editor): 
    MyModel = apps.get_model('myApp 'MyModel')

然后像这样调用该函数:

class Migration(migrations.Migration):
    operations = [
        migrations.RunPython(initialize_mhs, reverse_code=migrations.RunPython.noop),
    ]

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

问题出在我的模型中,出于某种原因,Django 在我的外键列的末尾添加了“_id”。我必须明确地将相关名称设置为外键。这里 'Cards' 是父 table,'Prices' 是子 table。

class Cards(models.Model):
    unique_id = models.CharField(primary_key=True, max_length=45)
    name = models.CharField(max_length=225)   

class Prices(models.Model):
        unique_id = models.ForeignKey(Cards, models.DO_NOTHING)

更改为后有效:

class Cards(models.Model):
    unique_id = models.CharField(primary_key=True, max_length=45)
    name = models.CharField(max_length=225)   

class Prices(models.Model):
        unique_id = models.ForeignKey(Cards, models.DO_NOTHING, db_column='unique_id')

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

  • 手动将列添加到您的 table
  • 运行 python manage.py makemigrations
  • 返回删除您添加的那一列
  • 运行 python manage.py 迁移

当我遇到这个错误时,我解决它的极端方法是重置我的数据库:

  1. 重置您的数据库

对于 Heroku 上的 Postgresql:

Heroku > your_app > Resources > database > add-ons > 点击你的数据库并打开它

对于 postgresql

设置 > 重置数据库

  1. 删除 your_app > 迁移 > __pycache__ 中的所有文件,__init.py__
  2. 除外
  3. 删除 your_app > 迁移中的所有文件,__pycache__ 文件夹和 __init.py__
  4. 除外
  5. 然后运行:

    python manage.py makemigrations

    python manage.py migrate

    python manage.py createsuperuser

输入以创建您的超级用户,然后 运行:

python manage.py makemigrations

python manage.py migrate

python manage.py 

如果您能够从管理部分检查您的模型,那么现在应该没问题了。

只需删除数据库中 'django_migrations' 模型中该模型的相应行迁移。

然后重新 运行 python manage.py migrate app_name

我尝试了所有这些答案,但运气不佳!为了无害地解决这个问题,我所做的是返回迁移文件并找到第一次创建实际模型的位置,然后手动添加字段(在不存在错误消息的列中)。直到你 运行 makemigrations --dry-run 你 get/see “未检测到任何变化”并且它起作用了。基本上,就我而言,我必须小心地将我想要的数据库更改及时返回到正确的迁移文件中,而不是现在在迁移依赖链的末尾创建一个新的迁移。

运行解决了这个问题 python manage.py 迁移 在 Heroku 中 Bash shell

最终帮助我的是简单地删除数据库并重新创建它以及删除所有迁移文件(包括缓存)。 (仅删除迁移文件对我根本不起作用)

sudo su - postgres
psql
DROP DATABASE 'yourdatabase';
CREATE DATABASE 'yourdatabase';
GRANT ALL PRIVILEGES ON DATABASE 'yourdatabase' to 'yourdjangouser';

然后

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

如果您在开发中并且制作了一些不重要的数据示例,那么这一步对我来说很有用:只需刷新您的数据,进行迁移,然后迁移:

  • python manage.py flush
  • python manage.py makemigrations
  • python manage.py migrate

之后,您可以从头开始创建一个新的数据库,希望这些信息对您有所帮助。

  1. 在特定应用程序的 migrations 文件夹中打开 运行 在 makemigrations 命令后创建的最新 py 文件。
  2. 在 class 迁移中有一个名为 'operations' 的列表属性。
  3. 删除特定元素 migrations.RemoveField(...)。
  4. 保存并运行python manage.py migrate

解决该问题的一个更简单的方法是首先使您的模型与迁移中的模型完全一样。和 运行 python manage.py 迁移。

然后还原这些更改

运行

python manage.py makemigrations
python manage.py migrate

要检查应用了哪些迁移,哪些没有应用,请使用 -:

python manage.py showmigrations

我通过删除所有迁移文件解决了类似的问题(不要忘记备份)python manage.py makemigrations 将它们全部放入一个干净的开发文件中并在服务器上拉取新文件。在那之前我已经删除了 PostgreSQL 上的现有表。