SQLAlchemy 2.0 高级特性详解

海哥  金牌会员 | 2024-12-23 14:47:45 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

SQLAlchemy 2.0 高级特性详解

一、关系运算符 any 与 has

1. any 方法

用于一对多关系中,查抄集合中是否存在满意条件的元素。
  1. from sqlalchemy import select
  2. # 示例:查找有任何价格大于100的商品的订单
  3. stmt = select(Order).where(Order.items.any(Item.price > 100))
  4. # 带多个条件
  5. stmt = select(Order).where(Order.items.any(
  6.     and_(Item.price > 100, Item.status == 'active')
  7. ))
复制代码
2. has 方法

用于多对一关系中,查抄关联对象是否满意条件。
  1. # 示例:查找属于特定用户的订单
  2. stmt = select(Order).where(Order.user.has(User.name == 'John'))
复制代码
二、Session 缓存机制

1. 一级缓存(Session Cache)

  1. from sqlalchemy.orm import Session
  2. session = Session()
  3. # 第一次查询会访问数据库
  4. user = session.query(User).filter_by(id=1).first()
  5. # 第二次查询会直接从缓存获取
  6. same_user = session.query(User).filter_by(id=1).first()
复制代码
2. 缓存刷新

  1. # 使所有对象过期
  2. session.expire_all()
  3. # 使特定对象过期
  4. session.expire(user)
  5. # 刷新特定对象
  6. session.refresh(user)
复制代码
三、Mapped Column 默认值设置

1. default

在 Python 层面设置默认值:
  1. from sqlalchemy.orm import mapped_column
  2. class User(Base):
  3.     __tablename__ = 'users'
  4.    
  5.     id = mapped_column(Integer, primary_key=True)
  6.     status = mapped_column(String, default='active')
复制代码
2. server_default

在数据库层面设置默认值:
  1. from sqlalchemy import text
  2. created_at = mapped_column(
  3.     DateTime,
  4.     server_default=text('CURRENT_TIMESTAMP')
  5. )
复制代码
3. default_factory

使用函数动态生成默认值:
  1. from datetime import datetime
  2. class User(Base):
  3.     created_at = mapped_column(
  4.         DateTime,
  5.         default_factory=datetime.utcnow
  6.     )
复制代码
四、Join 操作和关系加载

1. 基本 Join

  1. # 简单连接
  2. stmt = select(User).join(User.addresses)
  3. # 指定连接条件
  4. stmt = select(User).join(Address, User.id == Address.user_id)
复制代码
2. Options 加载计谋

  1. from sqlalchemy.orm import joinedload, selectinload
  2. # 使用 joinedload 预加载关系
  3. stmt = select(User).options(joinedload(User.addresses))
  4. # 使用 selectinload 进行分离加载
  5. stmt = select(User).options(selectinload(User.addresses))
复制代码
五、级联操作(Cascades)

1. 基本级联设置

  1. class User(Base):
  2.     __tablename__ = 'users'
  3.    
  4.     id = mapped_column(Integer, primary_key=True)
  5.     addresses = relationship(
  6.         "Address",
  7.         cascade="all, delete-orphan"
  8.     )
复制代码
2. 常用级联选项



  • save-update: 默认选项,生存关联对象
  • delete: 删除关联对象
  • delete-orphan: 删除孤立对象
  • merge: 归并关联对象
  • refresh-expire: 刷新或过期关联对象
六、性能优化发起

1. 查询优化

  1. # 使用 select_from 优化复杂查询
  2. stmt = (
  3.     select(User)
  4.     .select_from(User)
  5.     .join(User.addresses)
  6.     .options(contains_eager(User.addresses))
  7. )
复制代码
2. 缓存使用

  1. # 合理使用 Session 缓存
  2. session = Session()
  3. # 批量操作时清理缓存
  4. if len(results) > 1000:
  5.     session.expire_all()
复制代码
3. 耽误加载

  1. class User(Base):
  2.     addresses = relationship(
  3.         "Address",
  4.         lazy="dynamic"  # 延迟加载
  5.     )
复制代码
这些特性和本领能帮助你更好地使用 SQLAlchemy 2.0,进步应用性能和代码质量。记着要根据具体场景选择符合的特性和优化计谋。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表