1. 什么是 ORM(对象关系映射)
ORM(Object Relational Mapping)是一种编程技术,它允许开发人员使用面向对象的方式来操作关系型数据库。在传统的数据库操作中,我们需要编写 SQL 语句来进行数据的增删改查。而使用 ORM 后,我们可以通过操作对象来间接操作数据库,将对象的属性和方法映射到数据库的表、列和操作上。
例如,在 Python 中常见的 ORM 库有 SQLAlchemy 和 Django ORM。以下是一个使用 SQLAlchemy 定义一个简单用户模型的示例:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
在这个示例中,User
类就是一个 ORM 模型,它对应数据库中的 users
表,id
、name
和 email
是表中的列。
2. ORM 模型的数据存储方式
ORM 模型通常将数据库中的数据存储在对象的属性中。当我们从数据库中查询数据时,ORM 会将查询结果封装成对象,数据存储在对象的属性里。例如:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///test.db')
Session = sessionmaker(bind=engine)
session = Session()
# 查询一个用户
user = session.query(User).filter_by(id=1).first()
# 数据存储在对象的属性中
print(user.name) # 访问用户的姓名
print(user.email) # 访问用户的邮箱
在这个示例中,user
是一个 User
对象,数据库中的数据被存储在 user
对象的 name
和 email
属性中。
3. from_attributes=True
在处理 ORM 模型时的作用
当我们使用 Pydantic 模型来验证和处理从 ORM 模型获取的数据时,from_attributes=True
配置就非常有用了。
不使用 from_attributes=True
的情况
如果没有设置 from_attributes=True
,Pydantic 模型默认期望传入的数据是字典形式。例如:
from pydantic import BaseModel
class UserModel(BaseModel):
id: int
name: str
email: str
# 尝试使用 ORM 对象初始化 Pydantic 模型
try:
user_model = UserModel(user) # 这里会报错
except Exception as e:
print(f"Error: {e}")
在这个示例中,直接将 user
(ORM 对象)传递给 UserModel
会引发错误,因为 Pydantic 模型期望的是字典形式的数据。
使用 from_attributes=True
的情况
当我们设置 from_attributes=True
时,Pydantic 模型会尝试从对象的属性中提取数据。例如:
from pydantic import BaseModel, ConfigDict
class UserModel(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
name: str
email: str
# 使用 ORM 对象初始化 Pydantic 模型
user_model = UserModel.model_validate(user)
print(user_model)
在这个示例中,由于设置了 from_attributes=True
,UserModel
可以直接从 user
对象的属性中提取数据,从而成功创建 UserModel
实例。
总结
from_attributes=True
配置使得 Pydantic 模型能够方便地处理从 ORM 模型获取的数据,避免了手动将 ORM 对象转换为字典的繁琐过程,提高了代码的简洁性和可维护性。