创建或更改 PostgreSQL Table 以确保 Django 模型匹配
Create or Alter PostgreSQL Table to ensure Django Models match
我 运行 今天在开发 Django 项目时遇到了一个恼人的问题,我试图在测试数据库和开发数据库之间移动,但我似乎无法找到可靠的方法关于解决迁移问题。
让我们调用我的 'test' 数据库:testDB 和我的 'dev' 数据库:devDB
我像往常一样通过 Django settings.py 访问 testDB 并且我添加了 clientID 字段进行迁移下面的代码。
然后,我决定将 Django 的 settings.py 中的 devDB 换成 运行 python manage.py migrate,我的 clientID 字段没有添加到新数据库中。当我 运行 python manage.py makemigrations 时,我得到了预期的 "no changes detected".
请注意,我在进行迁移后使用 PyPi 的 django-reset-migrations 包,因此迁移文件夹不会变得复杂,所有内容都存储在单个 0001_initial.py 迁移文件中。
我没有看到比编写我自己的脚本更好的方法来处理这个问题,该脚本确保所有模型 table 存在于我连接的任何数据库中,并且所有模型字段都位于每个table,否则 table 已更改并添加了适当的列,这让我想到了我的问题...
如果我使用:python manage.py sqlmigrate objects 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 错误说明字段不存在,即使我 运行 迁移。
到目前为止,我已经能够解决我的问题,我清除了我连接的任何数据库,然后 运行ning python manage.py migrate 基于初始迁移文件,但这对于我无法重置所有内容的生产实例来说不是有效的解决方案。
我需要想法,我认为基于我从 python manage.py sqlmigrate objects 0001
获得的字符串的 alter table 语句是迄今为止最好的,但我愿意接受任何可以解决的问题我的问题所以我不用再担心了。
请注意,我在进行迁移后使用 PyPi 的 django-reset-migrations 包,因此迁移文件夹不会变得复杂并且所有内容都存储在单个 0001_initial.py 迁移文件。
您的问题的解决方案很简单:停止这样做。
以这种方式重置迁移文件是一种高级的、具有潜在危险的技术。它从来不是必需的,但在某些情况下可能会有帮助。迁移文件夹 "getting complicated" 不是真正需要解决的问题,尤其是对于刚开始的项目。
它的危险之处在于,根据设计,它正在清除对模型和数据库所做更改的历史记录。因此,如果您 运行 在数据库未完全更新时使用它(显然您已经这样做了),那么您已经删除了执行此操作所需的信息。 (具体来说,当您在迁移开发数据库之前重置迁移时,您删除了指定如何添加新列的文件。)
我 运行 今天在开发 Django 项目时遇到了一个恼人的问题,我试图在测试数据库和开发数据库之间移动,但我似乎无法找到可靠的方法关于解决迁移问题。
让我们调用我的 'test' 数据库:testDB 和我的 'dev' 数据库:devDB
我像往常一样通过 Django settings.py 访问 testDB 并且我添加了 clientID 字段进行迁移下面的代码。
然后,我决定将 Django 的 settings.py 中的 devDB 换成 运行 python manage.py migrate,我的 clientID 字段没有添加到新数据库中。当我 运行 python manage.py makemigrations 时,我得到了预期的 "no changes detected".
请注意,我在进行迁移后使用 PyPi 的 django-reset-migrations 包,因此迁移文件夹不会变得复杂,所有内容都存储在单个 0001_initial.py 迁移文件中。
我没有看到比编写我自己的脚本更好的方法来处理这个问题,该脚本确保所有模型 table 存在于我连接的任何数据库中,并且所有模型字段都位于每个table,否则 table 已更改并添加了适当的列,这让我想到了我的问题...
如果我使用:python manage.py sqlmigrate objects 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 错误说明字段不存在,即使我 运行 迁移。
到目前为止,我已经能够解决我的问题,我清除了我连接的任何数据库,然后 运行ning python manage.py migrate 基于初始迁移文件,但这对于我无法重置所有内容的生产实例来说不是有效的解决方案。
我需要想法,我认为基于我从 python manage.py sqlmigrate objects 0001
获得的字符串的 alter table 语句是迄今为止最好的,但我愿意接受任何可以解决的问题我的问题所以我不用再担心了。
请注意,我在进行迁移后使用 PyPi 的 django-reset-migrations 包,因此迁移文件夹不会变得复杂并且所有内容都存储在单个 0001_initial.py 迁移文件。
您的问题的解决方案很简单:停止这样做。
以这种方式重置迁移文件是一种高级的、具有潜在危险的技术。它从来不是必需的,但在某些情况下可能会有帮助。迁移文件夹 "getting complicated" 不是真正需要解决的问题,尤其是对于刚开始的项目。
它的危险之处在于,根据设计,它正在清除对模型和数据库所做更改的历史记录。因此,如果您 运行 在数据库未完全更新时使用它(显然您已经这样做了),那么您已经删除了执行此操作所需的信息。 (具体来说,当您在迁移开发数据库之前重置迁移时,您删除了指定如何添加新列的文件。)