如何使用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
相关产品推荐
相关产品推荐

