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

如何使用SQLAlchemy新语法定义Unique Constraint?

SQLAlchemy新语法定义唯一约束的正确方式

你的代码里直接在类中写UniqueConstraint('name')不会生效,因为声明式映射中,这类约束需要通过__table_args__属性声明,或者直接在列定义时设置unique=True参数。以下是两种正确的写法,同时附上Table()核心语法的实现方式:

一、声明式映射(Declarative Base)的正确写法

方式1:在列定义中直接设置unique=True

适合单字段唯一约束的场景,写法更简洁:

from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy import Integer, String
from typing import List

class User(Base):
    __tablename__ = 'users'

    user_id: Mapped[int] = mapped_column(Integer, primary_key=True)
    name: Mapped[str] = mapped_column(String, unique=True)  # 此处添加唯一约束

    addresses: Mapped[List['Address']] = relationship(back_populates='user')

方式2:通过__table_args__声明UniqueConstraint

适合多字段组合唯一约束的场景,也可以指定约束的自定义名称:

from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy import Integer, String, UniqueConstraint
from typing import List

class User(Base):
    __tablename__ = 'users'

    user_id: Mapped[int] = mapped_column(Integer, primary_key=True)
    name: Mapped[str] = mapped_column(String)

    addresses: Mapped[List['Address']] = relationship(back_populates='user')

    # 定义表级约束,可指定约束名称(可选)
    __table_args__ = (
        UniqueConstraint('name', name='uq_user_name'),
    )

二、Table()核心语法的写法

如果使用SQLAlchemy核心的Table对象定义表,直接将UniqueConstraint作为参数传入Table构造函数即可:

from sqlalchemy import Table, Column, Integer, String, UniqueConstraint, MetaData

metadata = MetaData()

users_table = Table(
    'users', metadata,
    Column('user_id', Integer, primary_key=True),
    Column('name', String),
    # 添加唯一约束,同样可自定义名称
    UniqueConstraint('name', name='uq_user_name')
)

参考文档说明

唯一约束(UniqueConstraint)用于保证指定列或列组合的值在表中全局唯一。在声明式映射中,既可以通过列的unique=True参数快速定义单字段约束,也可以通过__table_args__定义更复杂的表级约束;在核心Table语法中,直接将约束对象作为Table的构造参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:17:43