【问题标题】:Why does Django with sqlite not insert unique constraint into the database schema?为什么带有 sqlite 的 Django 不将唯一约束插入到数据库模式中?
【发布时间】:2021-04-10 17:06:01
【问题描述】:

我开始将 Django 与 sqlite 一起使用,我想对表中两个字段的组合施加一个简单的唯一约束。为此,我使用了 Django 的 UniqueConstraint 类。然而,令我惊讶的是,约束并没有插入到数据库中的表模式中。我的 Django 模型如下所示:

from django.db import models

class Fruit(models.Model):
    fruit_id = models.IntegerField(primary_key=True)
    fruit_type = models.CharField(max_length=64, default='', blank=True, null=False)
    fruit_name = models.CharField(max_length=128, default='', blank=True, null=False)
    class Meta:
        models.UniqueConstraint(fields=['fruit_type', 'fruit_name'], name='unique_fruit_type_name')
        db_table = 'fruit'

迁移后,我通过执行检查数据库中的架构:

select sql from sqlite_master where type='table';

对于有问题的表,结果如下:

CREATE TABLE "fruit" ("fruit_id" integer NOT NULL PRIMARY KEY"fruit_type" varchar(64) NOT NULL), "fruit_name" varchar(128) NOT NULL

我期待得到:

CREATE TABLE "fruit" ("fruit_id" integer NOT NULL PRIMARY KEY"fruit_type" varchar(64) NOT NULL), "fruit_name" varchar(128) NOT NULL, UNIQUE (fruit_type, fruit_name)

UNIQUE 子句去哪儿了?它不应该在架构中吗?

【问题讨论】:

    标签: django sqlite constraints schema unique


    【解决方案1】:

    您直接在Meta 类中编写约束,但没有任何效果。您需要将其写入Meta 类中属性constraints [Django docs] 的列表中:

    from django.db import models
    
    class Fruit(models.Model):
        fruit_id = models.IntegerField(primary_key=True)
        fruit_type = models.CharField(max_length=64, default='', blank=True, null=False)
        fruit_name = models.CharField(max_length=128, default='', blank=True, null=False)
        class Meta:
            constraints = [
                models.UniqueConstraint(fields=['fruit_type', 'fruit_name'], name='unique_fruit_type_name')
            ]
            db_table = 'fruit'
    

    注意:确保在进行这些更改后运行 python manage.py makemigrationspython manage.py migrate

    【讨论】:

    • 是的!那成功了。现在我得到CREATE TABLE "fruit" ("fruit_id" integer NOT NULL PRIMARY KEY, "fruit_name" varchar(128) NOT NULL, "fruit_type" varchar(64) NOT NULL, CONSTRAINT "unique_fruit_type_name" UNIQUE ("fruit_type", "fruit_name"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多