数据库
Pydantic 是一个为 ORM(对象关系映射)库定义模型的绝佳工具。ORM 用于将对象映射到数据库表,反之亦然。
SQLAlchemy¶
Pydantic 可以与 SQLAlchemy 配合使用,因为它可用于定义数据库模型的模式。
代码重复
如果您将 Pydantic 与 SQLAlchemy 一起使用,可能会因代码重复而感到一些困扰。如果您发现自己遇到了这个困难,您也可以考虑使用 SQLModel
,它将 Pydantic 与 SQLAlchemy 集成在一起,从而消除了大部分代码重复。
如果您更喜欢将纯 Pydantic 与 SQLAlchemy 结合使用,我们建议您将 Pydantic 模型与 SQLAlchemy 模型一起使用,如下例所示。在这种情况下,我们利用 Pydantic 的别名功能,用一个保留的 SQLAlchemy 字段来命名一个 Column
,从而避免冲突。
import sqlalchemy as sa
from sqlalchemy.orm import declarative_base
from pydantic import BaseModel, ConfigDict, Field
class MyModel(BaseModel):
model_config = ConfigDict(from_attributes=True)
metadata: dict[str, str] = Field(alias='metadata_')
Base = declarative_base()
class MyTableModel(Base):
__tablename__ = 'my_table'
id = sa.Column('id', sa.Integer, primary_key=True)
# 'metadata' is reserved by SQLAlchemy, hence the '_'
metadata_ = sa.Column('metadata', sa.JSON)
sql_model = MyTableModel(metadata_={'key': 'val'}, id=1)
pydantic_model = MyModel.model_validate(sql_model)
print(pydantic_model.model_dump())
#> {'metadata': {'key': 'val'}}
print(pydantic_model.model_dump(by_alias=True))
#> {'metadata_': {'key': 'val'}}
注意
上面的例子之所以能正常工作,是因为在字段填充时,别名的优先级高于字段名。访问 SQLModel
的 metadata
属性将导致 ValidationError
。