创建或更改PostgreSQL表以确保Django模型匹配

时间:2018-11-15 22:48:51

标签: python django postgresql django-migrations

今天,在Django项目的开发过程中,我遇到了一个令人烦恼的问题,当时我试图在测试数据库和开发数据库之间移动,而我似乎无法找出解决迁移问题的可靠方法。

我们叫我的“测试”数据库: testDB 和我的“开发”数据库: devDB

我照常通过Django settings.py访问 testDB ,并添加了您在以下代码中看到的 clientID 字段进行迁移。

然后,我决定交换到Django的settings.py中的 devDB 以运行 python manage.py migration 和我的 clientID 字段没有添加到新的数据库。当我运行 python manage.py makemigrations 时,得到的结果是“未检测到更改”。

请注意,在进行迁移后,我使用的是PyPi的django-reset-migrations软件包,因此Migrations文件夹不会变得复杂,并且所有内容都存储在单个0001_initial.py迁移文件中。

我没有比通过编写自己的脚本来解决这个问题的更好的方法,该脚本可以确保所有Model表都存在于我连接的任何DB中,并且所有Model字段都位于每个表中,否则该表将被更改并添加了适当的列,这使我想到了问题...

如果我使用: python manage.py sqlmigrate对象0001 (这是我的0001_initial.py文件),则会看到以下创建代码:

CREATE TABLE "objects_users" (
    "id" serial NOT NULL PRIMARY KEY, 
    "clientID" integer NOT NULL, 
    "email" varchar(100) NOT NULL, 
    "first_name" varchar(100) NOT NULL, 
    "last_name" varchar(100) NOT NULL, 
    "phone" varchar(100) NOT NULL, 
    "password" varchar(100) NOT NULL, 
    "type" varchar(100) NOT NULL, 
    "date_created" timestamp with time zone NOT NULL, 
    "active" varchar(100) NOT NULL);

如何使用此创建语句并循环包含的字段,以确保它们在我连接的数据库中可用(使用我假设的alter语句将是最佳方法)?

大音符

我只与Django一起工作了几个月,但我确实回想起Django的文档,这通常是将属性 null = true 添加到添加的 Model中的最佳方法.fields ,以便在发生迁移时将它们简单地自动添加到数据库中。我不确定这是否是我的问题,我只是想寻找一个解决方案,该解决方案可以自动确保无论连接到哪个数据库,我都可以完全同步,并且没有SQL错误指出字段不存在,即使我执行迁移。

到目前为止,我已经能够解决我的问题,只需根据初始迁移文件清除我连接的所有数据库,然后运行 python manage.py migration ,但这是无效的我无法重设所有功能的生产实例的解决方案。

我需要一些想法,我认为到目前为止,基于从python manage.py sqlmigrate objects 0001获得的字符串的alter table语句是最好的,但是我愿意接受任何可以解决我的问题的方法,因此我不必不再为此担心。

1 个答案:

答案 0 :(得分:1)

请注意,在进行迁移后,我使用的是PyPi的django-reset-migrations包,因此migrations文件夹不会变得复杂,并且所有内容都存储在单个0001_initial.py migrations中文件。

解决问题的方法很简单:停止这样做。

以这种方式重置迁移文件是一种高级的,潜在的危险技术。它从不需要,但在某些情况下可能会有所帮助。迁移文件夹“变得越来越复杂”并不是需要解决的实际问题,尤其是对于开始的项目。

使之很危险的是,由于设计原因,它擦除了对模型和数据库所做的更改的历史记录。因此,如果您在数据库未完全更新时(显然已经完成)运行它,那么您已经删除了这样做所需的信息。 (特别是,在迁移开发数据库之前重置迁移时,您删除了指定如何添加新列的文件。)