通过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)