SQLAlchemy 2.0 高级特性详解

ops/2024/12/22 14:05:10/

SQLAlchemy 2.0 高级特性详解

一、关系运算符 any 与 has

1. any 方法

用于一对多关系中,检查集合中是否存在满足条件的元素。

from sqlalchemy import select# 示例:查找有任何价格大于100的商品的订单
stmt = select(Order).where(Order.items.any(Item.price > 100))# 带多个条件
stmt = select(Order).where(Order.items.any(and_(Item.price > 100, Item.status == 'active')
))

2. has 方法

用于多对一关系中,检查关联对象是否满足条件。

# 示例:查找属于特定用户的订单
stmt = select(Order).where(Order.user.has(User.name == 'John'))

二、Session 缓存机制

1. 一级缓存(Session Cache)

from sqlalchemy.orm import Sessionsession = Session()# 第一次查询会访问数据库
user = session.query(User).filter_by(id=1).first()# 第二次查询会直接从缓存获取
same_user = session.query(User).filter_by(id=1).first()

2. 缓存刷新

# 使所有对象过期
session.expire_all()# 使特定对象过期
session.expire(user)# 刷新特定对象
session.refresh(user)

三、Mapped Column 默认值设置

1. default

在 Python 层面设置默认值:

from sqlalchemy.orm import mapped_columnclass User(Base):__tablename__ = 'users'id = mapped_column(Integer, primary_key=True)status = mapped_column(String, default='active')

2. server_default

数据库层面设置默认值:

from sqlalchemy import textcreated_at = mapped_column(DateTime,server_default=text('CURRENT_TIMESTAMP')
)

3. default_factory

使用函数动态生成默认值:

from datetime import datetimeclass User(Base):created_at = mapped_column(DateTime,default_factory=datetime.utcnow)

四、Join 操作和关系加载

1. 基本 Join

# 简单连接
stmt = select(User).join(User.addresses)# 指定连接条件
stmt = select(User).join(Address, User.id == Address.user_id)

2. Options 加载策略

from sqlalchemy.orm import joinedload, selectinload# 使用 joinedload 预加载关系
stmt = select(User).options(joinedload(User.addresses))# 使用 selectinload 进行分离加载
stmt = select(User).options(selectinload(User.addresses))

五、级联操作(Cascades)

1. 基本级联设置

class User(Base):__tablename__ = 'users'id = mapped_column(Integer, primary_key=True)addresses = relationship("Address",cascade="all, delete-orphan")

2. 常用级联选项

  • save-update: 默认选项,保存关联对象
  • delete: 删除关联对象
  • delete-orphan: 删除孤立对象
  • merge: 合并关联对象
  • refresh-expire: 刷新或过期关联对象

六、性能优化建议

1. 查询优化

# 使用 select_from 优化复杂查询
stmt = (select(User).select_from(User).join(User.addresses).options(contains_eager(User.addresses))
)

2. 缓存使用

# 合理使用 Session 缓存
session = Session()# 批量操作时清理缓存
if len(results) > 1000:session.expire_all()

3. 延迟加载

class User(Base):addresses = relationship("Address",lazy="dynamic"  # 延迟加载)

这些特性和技巧能帮助你更好地使用 SQLAlchemy 2.0,提高应用性能和代码质量。记住要根据具体场景选择合适的特性和优化策略。


http://www.ppmy.cn/ops/144033.html

相关文章

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解:以4.5版本为例 每个 WPS 程序的功能程序1:geogrid程序2:ungrib程序3:metgrid WPS运行(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extract…

大数据-环保领域

在生态环境领域,我国正在加快建设布局合理、功能完善的生态环境监测网络,实现对环境质量、重点污染源、生态状况监测的全覆盖。建设生态环境大数据平台,提高环境综合分析、预警预测和协同监管能力,搭建面向社会公众和组织的数据开…

C# OpenCV机器视觉:图像分割(让照片中的物体各自“安家”!)

在一个无聊的周末,阿强决定去参加一个朋友的聚会。他兴奋地准备好相机,想要记录下这次难忘的时刻。然而,当他查看自己拍的照片时,发现每张照片都像是一幅混乱的拼图,物体之间的界限模糊不清,仿佛所有的东西…

代码随想录算法日记day16 | 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

原题链接&&讲解 222. 完全二叉树的节点个数 112. 路径总和 106.从中序与后序遍历序列构造二叉树 讲解>>代码随想录 222. 完全二叉树的节点个数 题目 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在…

MySQL数据库下载及安装教程

链接:MySQL数据库下载及安装教程(最最新版)_mysql下载安装-CSDN博客 亲测安装成功了💕 把这个路径放到系统环境变量里头 MD!我这安到C盘去了,就很烦🤬😡 在CMD登录试一下 mysql -h localhos…

Flutter组合动画学习

如何使用动画控制器和动画来创建一个简单的动画效果。具体来说,它通过一个 AnimationController 来控制两个动画,一个用于旋转,一个用于绘制。 前置知识点学习 SingleTickerProviderStateMixin SingleTickerProviderStateMixin 是 Flutter …

wsl下Ubuntu(Linux)配置VSCode环境(C、C++)

一.vscode链接WSL 看我的另一篇博文: Vscode连接WSL2(Ubuntu20.04)_wsl2 vscode-CSDN博客 二.Linux系统配置c、c环境 和windows一样,要想使用C、C,要对系统环境进行配置,Linux是要安装gcc、g、gdb //可以用下面的代码在ubuntu…

uniapp实现手写签名,并在app中将其转为base64格式的图片

这里写自定义目录标题 1 手写签名页面&#xff1a;2 封装canvas组件&#xff1a;3 预览base64格式的签名图片&#xff1a; uniapp实现手写签名&#xff0c;并在app中将其转为base64格式的图片 1 手写签名页面&#xff1a; <template> <!-- 手写签名--><!-- &l…