SQL 转 SQLAlchemy:使用 extract 和 func.to_char

拾柒
拾柒
发布时间:2026-10-14| 4人浏览过
原创

在使用 SQLAlchemy 进行 ORM 开发时,经常需要将原生 SQL 中的时间处理函数转换为 Pythonic 表达式。本文将展示如何利用 db.func.extract 提取日期部件,或通过 db.func 直接调用数据库原生函数(如 PostgreSQL 的 to_char),从而构建复杂的分组查询。

使用 extract 函数拆分年月

在原生 SQL 中,我们常使用 to_char(date_published, 'yyyymm') 将日期格式化为字符串以进行分组。在 SQLAlchemy 中,推荐使用标准的 extract() 函数分别提取年份和月份,然后组合成整型键值,这样兼容性更好且计算效率更高。

第1步:提取年和月字段

通过 db.func.extract(field_type, column) 获取日期的年份和月份数值。

year_field = db.func.extract('year', ArticleModel.date_published)
month_field = db.func.extract('month', ArticleModel.date_published)

第2步:组合为年月标识符

将年份乘以 100 加上月份,生成类似 202305 的唯一标识符,便于后续排序和显示。

yonth_field = year_field * 100 + month_field

第3步:执行查询并分组

使用 .label() 命名字段,配合 group_by 进行聚合统计。注意在老版本 SQLAlchemy 中可能需要对 label 名称进行显式分组,新版本通常支持直接使用表达式分组。

result = db.session.query(
    yonth_field.label('yonth'),
    db.func.count(1)
).group_by(yonth_field).all()

生成的 SQL 逻辑大致如下:

SELECT EXTRACT(year FROM ...)*100 + EXTRACT(month FROM ...) AS yonth,
       count(*) AS count_1 
FROM article_meta 
JOIN article ON ... 
GROUP BY yonth

使用 func 直接调用数据库函数

如果希望保持与原生 SQL 完全一致的字符串格式化行为,可以直接利用 SQLAlchemy 的 func 对象调用后端支持的自定义函数。例如在 PostgreSQL 数据库中直接使用 to_char。

操作步骤

构建查询时,将业务模型字段传入对应的 func 函数中,并设置 label。这种方式简单直接,但依赖于具体数据库方言的支持。

yonth = db.func.to_char(ArticleModel.date_published, 'yyyymm').label('yonth')

archive_list = db.session.query(
    yonth,
    db.func.count(1)
).group_by(yonth).all()

此方法生成的 SQL 会原样保留 TO_CHAR 调用,适用于需要精确控制输出格式的场景。

总结

将 SQL 转换为 SQLAlchemy 语句的核心在于理解 ORM 如何映射数据库函数。extract()`提供了跨数据库的通用解决方案,而 func`则允许灵活调用任意数据库内置函数。根据实际需求选择合适的方式,可以编写出既高效又易读的查询代码。

以上就是SQL转SQLAlchemy转换的小例子的详细内容,更多关于SQLAlchemy操作技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。