通过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?
在学习完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) 我搜索了很多这个错误,但我只找到了一些背后有更多信息的错误,例如“致命:...”。我的没有。它只说
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) 我正在尝试将 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) 我正在尝试在 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,因为列是静态的...
在我们的一个项目中,我们多年来一直在所有模型中使用 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 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) 我将 FastAPI 与 SQLModel 结合使用,它基于 pydantic、SQLAlchemy 和类型提示。我正在尝试创建一个BitInteger(int64就足够了)专栏。我怎么做?
我的 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)
提前致谢!
我的数据库中有一些资源继承到它们的子资源。当我查询资源时,我还需要能够获取继承的资源。我有一个名为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字段。我希望这能让事情变得更简单一些?
我想定义一个具有自引用(或递归)外键的模型,使用SQLModel. (这种关系模式有时也称为邻接列表。)纯实现在SQLAlchemy其文档中进行了描述。
假设我想实现上面链接的示例中描述的基本树结构SQLAlchemy,其中我有一个Node模型,每个实例都有一个id主键、一个data字段(例如 type str)和对另一个实例的可选引用(读取外键)我们称之为其父节点(字段名称parent_id)的节点。
理想情况下,每个Node对象都应该有一个属性,如果该节点没有父节点,则该属性parent将为;None否则它将包含(指向)父Node对象的指针。
更好的是,每个Node对象都应该有一个属性,该属性是将其作为父对象引用的对象children列表。Node
问题是双重的:
实现这个的优雅方法是什么SQLModel?
我如何创建这样的节点实例并将它们插入数据库?
python sqlalchemy adjacency-list self-referencing-table sqlmodel
python ×10
sqlmodel ×10
sqlalchemy ×6
fastapi ×4
alembic ×1
datetime ×1
docker ×1
foreign-keys ×1
ltree ×1
orm ×1
postgresql ×1
pydantic ×1
python-3.x ×1
sql ×1