【问题标题】:Django Postgresql dropping column defaults at migrateDjango Postgresql 在迁移时删除列默认值
【发布时间】:2017-07-11 05:50:24
【问题描述】:

我遇到了表格默认值的问题。

例如我有这个模型:

class model1(models.Model):
        field1 = models.CharField(max_length=50, default='My Default Value 1',db_column='field1')
        field2 = models.CharField(max_length=10)

        class Meta:
            db_table = 'model1'

并且生成postgresql表没有默认:

mydb=# \d model1
                                Table "public.model1"
 Column |         Type          |                      Modifiers                      
--------+-----------------------+-----------------------------------------------------
 id     | integer               | not null default nextval('model1_id_seq'::regclass)
 field1 | character varying(50) | not null
 field2 | character varying(10) | not null
Indexes:
    "model1_pkey" PRIMARY KEY, btree (id)

migrate sqlmigrate 的输出是:

CREATE TABLE "model1" ("id" serial NOT NULL PRIMARY KEY, "field1" varchar(50) NOT NULL, "field2" varchar(10) NOT NULL);
COMMIT;

但是如果我修改模型中的默认值并运行 makemigrations/migrate 然后我查看 sqlmigrations 输出会在创建后生成一个奇怪的 DROP DEFAULT

ALTER TABLE "model1" ALTER COLUMN "field1" SET DEFAULT 'My Default Value 1 modified';
ALTER TABLE "model1" ALTER COLUMN "field1" DROP DEFAULT;
COMMIT;

是否有我遗漏的内容或不支持列的默认值?

【问题讨论】:

    标签: django postgresql default migrate


    【解决方案1】:

    我遇到了类似的问题:在没有停机时间的部署期间,数据库需要同时支持模型的两个版本(旧的和新的) - 所以在数据库中的字段真的很棒(旧模型不知道如何处理新字段)。

    可能的解决方案:

    1。等待这张票中提到的Field.db_default

    https://code.djangoproject.com/ticket/470 → 这将是最好的!

    2。使用 RunSQL 覆盖迁移

    RunSQL(
      'ALTER TABLE model1 ADD COLUMN new_field1 BOOLEAN NOT NULL DEFAULT false',
      'ALTER TABLE model1 DROP COLUMN new_field1',
      state_operations=[
          migrations.AddField(
              model_name='model1',
              name='new_field1',
              field=models.BooleanField(default=False),
              preserve_default=True,
          ),
      ],
    )
    

    请看https://pankrat.github.io/2015/django-migrations-without-downtimes/

    3。使用django-add-default-value

    https://github.com/3YOURMIND/django-add-default-value

    (目前我一直在使用这个选项)

    【讨论】:

      【解决方案2】:

      我知道这有点晚了,但我遇到了同样的问题。经过大量搜索,我找到了这个

      "Django 使用数据库默认值来设置现有行的值 桌子。它不会在数据库中保留默认值,因此丢弃 默认是正确的行为。”

      https://code.djangoproject.com/ticket/28000

      所以看起来这就是 django 的设计方式。它困扰着我,因为当我使用 MySQL 插入数据时,我收到了关于没有默认值的警告。

      唉,我敢肯定,比我聪明的人可以很好地解释他们为什么要这样设计它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-16
        • 1970-01-01
        • 2017-10-19
        • 2016-09-29
        • 2020-07-26
        • 2018-11-10
        • 2018-08-19
        • 1970-01-01
        相关资源
        最近更新 更多