Skip to content
🗂️ 文章分类: Python  
🏷️ 文章标签: SqlAlchemy  
📝 文章创建时间: 2025-12-30
🔥 文章最后更新时间:2025-12-30

[toc]

SqlAlchemy-serializer序列化库笔记

sqlalchemy-serializer 是一个专为 SQLAlchemy ORM 设计的序列化工具库,它提供了简单而强大的方式将 SQLAlchemy 模型对象转换为可序列化的字典数据或 JSON 数据。

安装 sqlalchemy-serializer 库

bash
pip install sqlalchemy-serializer

使用方式

如果想要某个sqlalchemy模型类能够被序列化,那么需要在定义sqlalchemy模型类的适合,让该模型类继承sqlalchemy_serializer.SerializerMixin类即可。

SerializerMixin类会给sqlalchemy模型类提供一个to_dict方法,该方法可以将sqlalchemy模型类对象转换为一个字典数据。

示例如下

python
from sqlalchemy import Column, Integer, String ,DateTime,CHAR,func

# 导入sqlalchemy_serializer库的SerializerMixin类
from sqlalchemy_serializer import SerializerMixin

# 定义sqlalchemy模型类,并继承SerializerMixin类
class UserModel(db.Model, SerializerMixin):
    __tablename__ = "t_user"
    id = Column("id",Integer, primary_key=True, autoincrement=True, comment='id')
    name = Column("name",String(255),unique=True,nullable=False, comment='名称')
    password = Column("password",String(255),unique=True,nullable=False, comment='密码')

# 查询用户,返回单个sqlalchemy模型类对象
user = db_session.query(UserModel).filter(UserModel.id == 111).first()
# 调用to_dict方法将sqlalchemy模型类对象转换为字典数据
user_dict = user.to_dict()
# 打印序列化后的字典数据
print(user_dict)

# 查询用户列表,返回sqlalchemy模型类对象数组
user_list_items = db_session.query(UserModel).all()
# 调用to_dict方法将sqlalchemy模型类对象数组转换为字典数据数组
user_dict_list = [item.to_dict() for item in user_list_items]
# 打印序列化后的用户列表
print(user_dict_list)

排除某个序列化字段

如果sqlalchemy模型类中的有的字段不需要被序列化,比如密码字段,那么可以通过设置rules参数,或者only参数来指定序列化规则。

代码示例如下

python
# 查询用户,返回单个sqlalchemy模型类对象
user = UserModel.query.filter(...).one()

# 调用to_dict方法将sqlalchemy模型类对象转换为字典数据,排除password字段
user_dict = user.to_dict(rules=('-password',))

# 调用to_dict方法将sqlalchemy模型类对象转换为字典数据,排除password和name字段
user_dict = user.to_dict(rules=('-password','-name'))
  • 调用to_dict方法的时候,传递了rules参数,并且设置了-password,其中的-号代表排除的意思,意思是不要序列化password字段。

排除多个序列化字段

我们还可以在SqlAlchemy模型类中定义一个__serializer_rules__属性,该属性的值是一个元组,元组中包含了需要被排除的字段名。

代码示例如下

python
# 定义sqlalchemy模型类,并继承SerializerMixin类
class UserModel(db.Model, SerializerMixin):
    __tablename__ = "t_user"
    id = Column("id",Integer, primary_key=True, autoincrement=True, comment='id')
    name = Column("name",String(255),unique=True,nullable=False, comment='名称')
    password = Column("password",String(255),unique=True,nullable=False, comment='密码')
    # 定义需要被排除的字段名
    __serializer_rules__ = ('-password','-name')

# 查询数据
user = db_session.query(UserModel).filter(UserModel.id == 111).first()
# 此时调用to_dict方法进行序列化数据,会自动排除__serializer_rules__属性中定义的字段
user_dict = user.to_dict()
print(user_dict)

Released under the MIT License.