即使在运行迁移后,Django Programming 错误列也不存在
Posted
技术标签:
【中文标题】即使在运行迁移后,Django Programming 错误列也不存在【英文标题】:Django Programming error column does not exist even after running migrations 【发布时间】:2017-07-25 14:37:21 【问题描述】:我运行 python manage.py makemigrations
并得到:
未检测到更改
然后,python manage.py migrate
我得到:
没有要应用的迁移。
然后,我尝试将更改推送到生产环境: git push heroku 大师 一切都是最新的
然后,在生产中,我重复命令: heroku 运行 python manage.py 迁移 没有要应用的迁移。
以防万一,我在生产中运行makemigrations
:
heroku run python manage.py makemigrations
No changes detected
为什么然后我得到一个
ProgrammingError at ....
column .... does not exist
“未检测到更改”表示数据库与代码一致。 我该如何调试这个?¡?
【问题讨论】:
【参考方案1】:我遇到了同样的问题(列不存在)但是当我尝试运行 migrate
而不是 makemigrations
时(我相信这是同样的问题)
原因:在为最后一次更改运行迁移之前,我删除了迁移文件并用单个伪装的初始迁移文件 0001 替换了它们
解决办法:
-
删除该应用迁移所涉及的表(如果有,请考虑备份解决方法)
从记录迁移的表
django_migrations
中删除负责迁移该应用程序的行,这是 Django 知道哪些迁移已应用以及哪些仍需要应用的方式。
这是解决这个问题的方法:
以 postgres 用户身份登录(我的用户名为 posgres):
sudo -i -u postgres
打开一个 sql 终端并连接到您的数据库:
psql -d database_name
列出您的表格并找出与该应用相关的表格:
\dt
删除它们(考虑与关系的删除顺序):
DROP TABLE tablename ;
标识 |应用 |姓名 |应用 --+--------+--------+---------+
SELECT * FROM django_migrations;
删除该应用程序的迁移行(您可以按 id 或按应用程序删除,应用程序不要忘记“引号”):
DELETE FROM django_migrations WHERE app='yourapp';
退出并仅运行您的迁移(可能在您的情况下运行 makemigrations):
python manage.py migrate --settings=your.settings.module_if_any
注意:在您的情况下,可能不必删除该应用程序的所有表,而不是所有迁移,只需删除导致问题的模型。
我希望这能有所帮助。
【讨论】:
遇到了同样的问题。在 heroku 控制台中删除表并重新运行迁移解决了它。谢谢!DROP TABLE tablename ;
会清除应用中的所有数据,对吗?
@Florent 它将删除表本身(所以是的,该表的数据将被删除)【参考方案2】:
Django 迁移记录在您的数据库中的“django_migrations”表下。这就是 Django 知道哪些迁移已应用以及哪些仍需要应用的方式。
查看数据库中的 django_migrations 表。应用迁移时可能出现问题。因此,删除表中具有与“不存在”的列相关的迁移文件名的行。然后,尝试重新运行迁移。
【讨论】:
为什么不使用回滚功能?我天真地尝试了这个,结果出现了一个依赖历史错误,并从我刚刚创建的备份中恢复。请谨慎使用。 能否在文档中提供回滚功能的链接? 哇,找不到。我仍然建议谨慎使用这个答案,但我发现最接近的是这个脚本:gist.github.com/Jc2k/bacff3105653f3b28e84 是的,我也不认为它存在。不知道为什么您会收到依赖历史记录错误。也许这取决于 Django 版本?无论哪种方式,这个快速修复应该只应用于应该明确的开发......【参考方案3】:这是我尝试过的,它奏效了:
手动将列添加到表中 运行 python manage.py makemigrations 返回删除您添加的那一列 运行 python manage.py migrate【讨论】:
【参考方案4】:我遇到了类似的问题 - 当我在 django-admin 站点上单击模型时出现错误消息。我通过注释掉 models.py 中的字段,然后运行迁移来解决它。在此之后,我取消了对该字段的注释并重新运行了迁移。之后错误信息消失了。
【讨论】:
我删除了所有迁移文件并注释掉也对我有用。 @GraceBe 我尝试了同样的事情,但它似乎没有帮助......【参考方案5】:我的案例可能有点晦涩,但如果它对某人有帮助,值得在这里记录。
我在我的一个迁移中调用了一个函数,该函数定期导入所述迁移的模型,即
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),
]
此外,原始导入一直有效,直到我在以后的迁移中修改了模型,这使得该错误更难定位。
【讨论】:
【参考方案6】:所以,我总是遇到这种问题,所以今天我决定尝试在数据库级别解决它。问题是,我更改了一个模型字段名称,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 相应的命令。
【讨论】:
【参考方案7】:问题出在我的模型中,出于某种原因,Django 将“_id”添加到我的外键列的末尾。我必须将相关名称显式设置为外键。这里的“卡片”是父表,“价格”是子表。
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')
【讨论】:
Django 总是添加“_id”。见docs.djangoproject.com/en/2.2/ref/models/fields/…【参考方案8】:当我收到这个错误时,我解决它的极端方法是重置我的数据库:
-
重置数据库
对于 Heroku 上的 Postgresql:
Heroku > your_app > Resources > database > add-ons > 点击你的数据库并打开它
对于postgresql
设置 > 重置数据库
-
删除 your_app 中的所有文件 > 迁移 >
__pycache__
除了__init.py__
删除 your_app 中的所有文件 > 迁移,__pycache__
文件夹和 __init.py__
除外
然后运行:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
输入创建您的超级用户,然后运行:
python manage.py makemigrations
python manage.py migrate
python manage.py
如果您能够从管理部分检查您的模型,那么现在应该没问题了。
【讨论】:
【参考方案9】:只需在数据库中的“django_migrations”模型中删除该模型的相应行迁移。
然后重新运行python manage.py migrate app_name
【讨论】:
【参考方案10】:我尝试了所有这些答案,但运气不佳!为了无害地解决这个问题,我所做的是返回迁移文件并找到第一次创建实际模型的位置,然后手动添加字段(在列中不存在错误消息)。直到如果您运行makemigrations --dry-run
,您会看到/看到“未检测到更改”并且有效。基本上,就我而言,我必须小心地将我想要的数据库更改及时带回正确的迁移文件中,而不是现在在迁移依赖链的末尾创建一个新的迁移。
【讨论】:
【参考方案11】:最终帮助我的是简单地删除数据库并重新创建它以及删除所有迁移文件(包括缓存)。 (仅删除迁移文件对我根本不起作用)
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
【讨论】:
【参考方案12】:如果您处于生产模式并且不需要您的数据库数据,这一步对我很有帮助:只需刷新您的数据、进行迁移和迁移:
python manage.py flush
python manage.py makemigrations
python manage.py migrate
之后,您可以从头开始创建一个新数据库,希望这些信息对您有所帮助。
【讨论】:
【参考方案13】:-
打开在该特定应用的迁移文件夹中运行 makemigrations 命令后创建的最新 py 文件。
在类 Migration 中有一个名为“操作”的列表属性。
移除特定元素 migrations.RemoveField(...)。
保存并运行
python manage.py migrate
。
【讨论】:
【参考方案14】:解决此问题的一个更简单的方法是首先使您的模型与迁移中的模型完全相同。并运行 python manage.py migrate。
然后还原这些更改
运行
python manage.py makemigrations
python manage.py migrate
要检查哪些迁移已应用,哪些未应用,请使用 -:
python manage.py showmigrations
【讨论】:
【参考方案15】:通过运行解决了这个问题 python manage.py 迁移 在 Heroku Bash shell 中
【讨论】:
以上是关于即使在运行迁移后,Django Programming 错误列也不存在的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 1.7 迁移之前运行 South 迁移的推荐方法是啥?
Django - 迁移命令说该表在执行第二次 makemigrations 后存在
Django 迁移在 GitHub Actions 中不起作用