You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用peewee创建非null时唯一、允许为null的CharField?

Peewee实现CharField非空唯一、空值可重复的解决方案

方案1:基础字段配置(适配绝大多数场景)

主流关系型数据库(SQLite、PostgreSQL、MySQL 5.7+ InnoDB等)的唯一约束默认将NULL视为互不相等的值,因此直接配置字段的null和unique参数即可满足需求:

from peewee import *

# 此处可替换为你使用的数据库连接类,如MySQLDatabase、PostgresqlDatabase
db = SqliteDatabase('test.db')

class User(Model):
    # 核心配置:允许为NULL + 全局唯一约束
    # 非NULL值会自动校验全局唯一,NULL值可重复写入
    optional_unique_id = CharField(max_length=64, null=True, unique=True)

    class Meta:
        database = db

方案2:自定义部分索引(适配特殊规则/数据库)

如果使用的数据库对唯一约束的NULL处理不符合预期,或者需要额外限制约束生效范围,可以通过Meta类的constraints参数手动创建部分唯一索引:

class User(Model):
    optional_unique_id = CharField(max_length=64, null=True)

    class Meta:
        database = db
        constraints = [
            # 仅对非NULL的字段值做唯一校验
            SQL("CREATE UNIQUE INDEX idx_user_optional_unique ON user (optional_unique_id) WHERE optional_unique_id IS NOT NULL")
        ]

注意事项

  • 写入空值时必须传Python的None,不要传空字符串'':空字符串属于有效非空值,会触发唯一约束校验,和NULL的语义完全不同
  • 给已存在的表新增该约束时,需要先清理表中已有的重复非空值,否则约束创建会失败

内容的提问来源于stack exchange,提问作者SimonB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:54:03