Django alterField 在修改 max_length 时不保留 NOT NULL
Django alterField does not preserve NOT NULL when modifying max_length
我正在编写 django 迁移以将以下模型中 CharField 上的 max_length 从 200 更改为 255,但这样做会将这些字段从不可为 null 更改为可为 null。我希望这些字段保持不可空。
使用 sqlmigrate
我可以看到 django 为每次迁移运行的 sql:
模型定义
# -*- coding: utf-8 -*-
from django.db import models
class Account(models.Model):
# Would be added by Django default anyways.
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
email = models.EmailField(max_length=200)
password = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
last_seen_at = models.DateTimeField(auto_now_add=True)
project_token = models.CharField(max_length=200)
url = models.URLField(max_length=200)
notification_emails = models.TextField(blank=True)
初始迁移 0001
BEGIN;
CREATE TABLE `pnmodels_account` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(200) NOT NULL, `email` varchar(200) NOT NULL, `password` varchar(200) NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `last_seen_at` datetime NOT NULL, `project_token` varchar(200) NOT NULL, `url` varchar(200) NOT NULL, `notification_emails` longtext NOT NULL);
COMMIT;
迁移 0002 以将 max_length 更新为 255
BEGIN;
ALTER TABLE `pnmodels_account` MODIFY `email` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `name` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `password` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `project_token` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `url` varchar(255);
COMMIT;
我认为0002中的MODIFY
需要包含NOT NULL
。这是 Django 错误还是我遗漏了什么?
使用:Django==1.7.7,我的sql客户端==1.3.6
这是一个已知问题,请参阅 https://code.djangoproject.com/ticket/24595
等待修复,您可能需要这样做 'by hand' 或者让您的列可以为 null 而不是可以为 null
我正在编写 django 迁移以将以下模型中 CharField 上的 max_length 从 200 更改为 255,但这样做会将这些字段从不可为 null 更改为可为 null。我希望这些字段保持不可空。
使用 sqlmigrate
我可以看到 django 为每次迁移运行的 sql:
模型定义
# -*- coding: utf-8 -*-
from django.db import models
class Account(models.Model):
# Would be added by Django default anyways.
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
email = models.EmailField(max_length=200)
password = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
last_seen_at = models.DateTimeField(auto_now_add=True)
project_token = models.CharField(max_length=200)
url = models.URLField(max_length=200)
notification_emails = models.TextField(blank=True)
初始迁移 0001
BEGIN;
CREATE TABLE `pnmodels_account` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(200) NOT NULL, `email` varchar(200) NOT NULL, `password` varchar(200) NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `last_seen_at` datetime NOT NULL, `project_token` varchar(200) NOT NULL, `url` varchar(200) NOT NULL, `notification_emails` longtext NOT NULL);
COMMIT;
迁移 0002 以将 max_length 更新为 255
BEGIN;
ALTER TABLE `pnmodels_account` MODIFY `email` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `name` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `password` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `project_token` varchar(255);
ALTER TABLE `pnmodels_account` MODIFY `url` varchar(255);
COMMIT;
我认为0002中的MODIFY
需要包含NOT NULL
。这是 Django 错误还是我遗漏了什么?
使用:Django==1.7.7,我的sql客户端==1.3.6
这是一个已知问题,请参阅 https://code.djangoproject.com/ticket/24595
等待修复,您可能需要这样做 'by hand' 或者让您的列可以为 null 而不是可以为 null