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

