如何使用 SQLModel 在两个或多个列上定义 UniqueConstraint?

Jun*_*ius 6 python sqlmodel

通过SQLAlchemy,可以使用UniqueConstraint声明在两个或多个列上创建约束。

使用SQLModel执行此操作的最惯用方法是什么?

例如:

from sqlmodel import SQLModel, Field


class SubAccount(SQLModel):
    id: int = Field(primary_key=True)
    name: str
    description: str
    user_id: int = Field(foreign_key="user.id")
Run Code Online (Sandbox Code Playgroud)

我怎样才能强制它name对于给定的应该是唯一的user_id

Dan*_*erg 11

到目前为止,完全一样的方式。SQLModel元类从 SQLAlchemy 类继承了大量内容DeclarativeMeta。在许多方面,您可以SQLModel像对待 SQLAlchemy ORM 基类一样对待子类。例子:

from sqlmodel import Field, SQLModel, UniqueConstraint, create_engine


class User(SQLModel, table=True):
    id: int = Field(primary_key=True)
...


class SubAccount(SQLModel, table=True):
    __table_args__ = (
        UniqueConstraint("name", "user_id", name="your_unique_constraint_name"),
    )
    id: int = Field(primary_key=True)
    name: str
    description: str
    user_id: int = Field(foreign_key="user.id")


if __name__ == '__main__':
    engine = create_engine("sqlite:///:memory:", echo=True)
    SQLModel.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)

SQLModel 甚至显式地从 SQLAlchemy 重新导入兼容的类/函数,以表明它们可以按照您期望的 SQLAlchemy 方式使用。

这并不是说这适用于所有情况。离得很远。该项目仍处于早期阶段。但在这种情况下确实如此。

以下是创建表的相应 SQL 输出:

CREATE TABLE subaccount (
    id INTEGER NOT NULL, 
    name VARCHAR NOT NULL, 
    description VARCHAR NOT NULL, 
    user_id INTEGER NOT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT your_unique_constraint_name UNIQUE (name, user_id), 
    FOREIGN KEY(user_id) REFERENCES user (id)
)
Run Code Online (Sandbox Code Playgroud)