标签: sqlmodel

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

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

python sqlmodel

6
推荐指数
1
解决办法
2524
查看次数

与 sqlmodel 的一对一关系

在学习完SQLModel教程后,我不记得看到过任何有关如何使用Relationship属性实现 1:1 关系的内容。

我找到了SQLAlchemy 的文档,但目前还不清楚这如何应用于 SQLModel。

代码示例:如何强制 User 和 ICloudAccount 具有 1:1 关系?

class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    icloud_account_id: Optional[int] = Field(default=None, foreign_key="icloudaccount.id")
    icloud_account: Optional["ICloudAccount"] = Relationship(back_populates="users")


class ICloudAccount(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    user_name: str
    users: List[User] = Relationship(back_populates="icloud_account")
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy sqlmodel

5
推荐指数
1
解决办法
4652
查看次数

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) 与 PostgreSQL

我搜索了很多这个错误,但我只找到了一些背后有更多信息的错误,例如“致命:...”。我的没有。它只说

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) 
Run Code Online (Sandbox Code Playgroud)

我在 docker 容器内有一个 postgres 数据库,该数据库已将其端口设置为标准 5432。我使用以下命令创建了该容器:

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
Run Code Online (Sandbox Code Playgroud)

它是干净的,因此没有创建数据库。API 应该自动创建它们。

我正在使用 Pycharm IDE,也许与此有关。

Traceback (most recent call last):
  File "C:\Users\Veril\PycharmProjects\partyapp-python\venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "C:\Users\Veril\PycharmProjects\partyapp-python\venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "C:\Users\Veril\PycharmProjects\partyapp-python\venv\lib\site-packages\uvicorn\middleware\debug.py", line 96, in __call__
    raise exc from None
  File "C:\Users\Veril\PycharmProjects\partyapp-python\venv\lib\site-packages\uvicorn\middleware\debug.py", line 93, in __call__
    await self.app(scope, receive, inner_send)
  File "C:\Users\Veril\PycharmProjects\partyapp-python\venv\lib\site-packages\fastapi\applications.py", line 208, in __call__
    await super().__call__(scope, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy docker fastapi sqlmodel

5
推荐指数
1
解决办法
2万
查看次数

'sa_relationship_kwargs={"lazy": "selectin"}' 在带有 Fastapi 的 SQLModel 上意味着什么?

我正在尝试将 SQLModel 与 Fastapi 结合使用,在路上我发现了这个用于实现实体关系的示例,我想知道这意味着什么sa_relationship_kwargs={"lazy": "selectin"}以及它有什么作用?

class UserBase(SQLModel):
    first_name: str
    last_name: str
    email: EmailStr = Field(nullable=True, index=True, sa_column_kwargs={"unique": True})    
    is_active: bool = Field(default=True)
    is_superuser: bool = Field(default=False)
    birthdate: Optional[datetime]
    phone: Optional[str]
    state: Optional[str]
    country: Optional[str]
    address: Optional[str]
    created_at: Optional[datetime]
    updated_at: Optional[datetime]

class User(UserBase, table=True):
    id: Optional[int] = Field(default=None, nullable=False, primary_key=True)
    hashed_password: str = Field(
        nullable=False, index=True
    )
    role_id: Optional[int] = Field(default=None, foreign_key="role.id")
    role: Optional["Role"] = Relationship(back_populates="users", sa_relationship_kwargs={"lazy": "selectin"})
    groups: List["Group"] = Relationship(back_populates="users", link_model=LinkGroupUser)

Run Code Online (Sandbox Code Playgroud)

python foreign-keys fastapi sqlmodel

5
推荐指数
1
解决办法
4589
查看次数

在 SQLModel 中使用表名动态设置 sql-default 值

我正在尝试在 SQLModel 中创建一个基类,如下所示:

class BaseModel(SQLModel):
    @declared_attr
    def __tablename__(cls) -> str:
        return cls.__name__

    guid: Optional[UUID] = Field(default=None, primary_key=True)

class SequencedBaseModel(BaseModel):
    sequence_id: str = Field(sa_column=Column(VARCHAR(50), server_default=text(f"SELECT '{TABLENAME}_' + convert(varchar(10), NEXT VALUE FOR dbo.sequence)")))
Run Code Online (Sandbox Code Playgroud)

所以我得到了一个这样的表:

class Project(SequencedBaseModel):
    ...
Run Code Online (Sandbox Code Playgroud)

Project其中 alembic 将为包含列guid和的表生成迁移sequence_id。序列 ID 的默认值是使用以下命令生成的序列

SELECT '{TABLENAME}_' + convert(varchar(10), NEXT VALUE FOR dbo.sequence)
Run Code Online (Sandbox Code Playgroud)

并且应该将值Project_1, ,Project_2插入到项目表中...

关于如何动态设置表名有什么想法吗?我无法使用构造函数来设置列,因为 alembic 忽略它们,我无法访问该__tablename__()函数,或者cls,因为列是静态的...

python sqlalchemy alembic sqlmodel

5
推荐指数
1
解决办法
1245
查看次数

将 SQLAlchemy 声明性基础与 SQL 模型结合使用

在我们的一个项目中,我们多年来一直在所有模型中使用 SQL Alchemy 声明性基础(并且有很多)。我们想尝试使用新的SQLModel 库来进行最新的模型声明。

为此,我们尝试将其与 Base 对象分开声明,并调用create_all两者的方法。

即: Base.metadata.create_all()SQLModel.metadata.create_all()

但是用 SQLModel 声明的模型不能识别用 Base 声明的表。

此时,我们无法将所有先前的模型声明从 Base 更改为 SQLModel。

这是一个可重现的代码:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer
from typing import Optional
from sqlmodel import Field, SQLModel
from sqlalchemy import String

# Declarative base object
Base = declarative_base()

class DummySATable(Base):
    __tablename__ = 'dummy_table'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32))


class DummyModelTable(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True) …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy python-3.x sqlmodel

4
推荐指数
1
解决办法
4236
查看次数

SqlModel 日期时间字段在执行时抛出错误

我在 python 3.8 中使用 SQLModel

当我添加日期时间字段时created_at: datetime = Field(default_factory=utcnow(), nullable=False)

我收到此 错误

File "./app/main.py", line 16, in <module>
    class Post(SQLModel, table=True):
  File "/Users/markwardell/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/sqlmodel/main.py", line 277, in __new__
    new_cls = super().__new__(cls, name, bases, dict_used, **config_kwargs)
  File "pydantic/main.py", line 204, in pydantic.main.ModelMetaclass.__new__
  File "pydantic/fields.py", line 488, in pydantic.fields.ModelField.infer
  File "pydantic/fields.py", line 419, in pydantic.fields.ModelField.__init__
  File "pydantic/fields.py", line 539, in pydantic.fields.ModelField.prepare
  File "pydantic/fields.py", line 801, in pydantic.fields.ModelField.populate_validators
  File "pydantic/validators.py", line 718, in find_validators
RuntimeError: error checking inheritance of <module 'datetime' from '/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/datetime.py'> …
Run Code Online (Sandbox Code Playgroud)

python datetime fastapi sqlmodel

3
推荐指数
2
解决办法
8720
查看次数

BigInteger 与 fastapi 和 sqlmodel

我将 FastAPI 与 SQLModel 结合使用,它基于 pydantic、SQLAlchemy 和类型提示。我正在尝试创建一个BitIntegerint64就足够了)专栏。我怎么做?

我的 sql 模型声明看起来像这样

class ItemBase(sqlmodel.SQLModel):
    name: str
    price: int  


class Item(ItemBase, table=True):
    id: int = sqlmodel.Field(default=None, primary_key=True)


class ItemCreate(ItemBase):
    pass
Run Code Online (Sandbox Code Playgroud)

提前致谢!

python sqlalchemy pydantic fastapi sqlmodel

3
推荐指数
1
解决办法
3182
查看次数

如何使用 PostgreSQL 按路径过滤

我的数据库中有一些资源继承到它们的子资源。当我查询资源时,我还需要能够获取继承的资源。我有一个名为path我计划使用的字段。始终path包含与我们当前正在处理的资源相关的所有资源的完整路径。

例子:

+-----------------------------------------+
| id | res_id    | path                   |
|-----------------------------------------|
| 1  | res_1     | res_1                  |
| 2  | res_1.1   | res_1.res_1.1          |
| 3  | res_1.2   | res_1.res_1.2          |
| 4  | res_1.1.1 | res_1.res_1.1.res_1.1.1|
+-----------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如果我查询res_1.1,我还必须获取 ,res_1因为它是 的父级res_1.1。如果我得到res_1.1.1,我还必须得到第 1 行和第 2 行,因为它们包含在 的路径中res_1.1.1。希望得到一些关于如何使用 Postgres 执行此操作的建议。如果这是重要信息,我也用来sqlmodel编写查询。

编辑。对于含糊的介绍,我深表歉意,该参数path已经是sqlalchemy Ltree字段。我希望这能让事情变得更简单一些?

python sql postgresql ltree sqlmodel

3
推荐指数
1
解决办法
466
查看次数

如何构建自引用/递归 SQLModel

我想定义一个具有自引用(或递归)外键的模型,使用SQLModel. (这种关系模式有时也称为邻接列表。)纯实现SQLAlchemy其文档中进行了描述。

假设我想实现上面链接的示例中描述的基本树结构SQLAlchemy,其中我有一个Node模型,每个实例都有一个id主键、一个data字段(例如 type str)和对另一个实例的可选引用(读取外键)我们称之为其父节点(字段名称parent_id)的节点。

理想情况下,每个Node对象都应该有一个属性,如果该节点没有父节点,则该属性parent将为;None否则它将包含(指向)父Node对象的指针。

更好的是,每个Node对象都应该有一个属性,该属性是将其作为父对象引用的对象children列表。Node

问题是双重的:

  1. 实现这个的优雅方法是什么SQLModel

  2. 我如何创建这样的节点实例并将它们插入数据库?

python sqlalchemy adjacency-list self-referencing-table sqlmodel

3
推荐指数
1
解决办法
1388
查看次数