首页 > 解决方案 > Dockerized Django 应用程序未应用唯一约束

问题描述

我有两个问题都是相互关联的

问题 #1

我的应用程序有一个用于存储数据的在线 Postgres 数据库。因为这是一个 Dockerized 应用程序,所以我创建的迁移不再出现在我的本地主机上,而是存储在 Docker 容器中。到目前为止,我看到的所有问题似乎都没有关于进行迁移并将唯一约束添加到表中的某个字段的问题。

我编写了 shell 代码来运行 python 脚本,该脚本在命令提示符窗口中返回迁移文件的内容。我能够获得要应用的迁移文件,并在 django_migrations 表中添加一行以指定相同的内容。然后我运行 makemigrations 并 migrate 但它说没有应用任何更改(这让我相信我添加到数据库中的行应该只有在 django 自己检测到迁移而不是我指定之后才由 django 自动创建迁移文件并要求它进行更改)。问题是现在,新的迁移仍然检测到以下变化

Migrations for 'mdp':
  db4mdp/mdp/migrations/0012_testing.py
    - Alter field mdp_name on languages

尽管检测到这种明显的“变化”,但我收到以下错误,

return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "mdp_mdp_mdp_fullname_281e4228_uniq" already exists

我已经使用 pgadmin4 检查了我的 postgres 服务器,以检查约束是否已实际应用于它。它具有上面指定的关系旁边的名称。那么,为什么 Django 显然会将此视为要进行的更改。问题是,如果我现在删除我在我的 python 目录中创建的新迁移文件,它可能会运行(因为更改已经“显然”在数据库中进行)但我不会有迁移文件来跟踪的变化。不过,既然我正在使用在线数据库,我不需要保留迁移。我不会回滚我所做的任何更改,也不会经常进行更改。这只是一两次的事情,但我想解决错误。

问题 #2

我在上述问题中使用“显然”的原因是,即使我的公共架构中的约束部分显示约束已被应用,出于某种原因,当我尝试使用非我定义为唯一的字段中的唯一字符串,无论如何它都允许创建它。

标签: pythondjangopostgresqldockerpgadmin-4

解决方案


您永远不会手动将任何内容添加到 django_migrations 表中。让 django 来做。如果它不这样做,无论如何,你的代码还没有准备好生产。我了解您正在 docker 中进行开发。当你这样做时,你将你的 docker 卷挂载到本地卷。由于您尚未安装它,因此您的迁移不会在本地显示。请参阅卷。它应该可以解决您的问题。


推荐阅读