Python原生SQL替代ORM工具查询及SQL转Python函数自动化咨询
现有成熟方案
- 你描述的这类工具早已有成熟实现,其中最贴合需求的是
anosql及其异步衍生版本aiosql:这两个库的核心功能就是将原生SQL语句/文件直接映射为可调用的Python函数,返回结果默认支持映射为namedtuple、dataclass等支持点号访问的结构,完全不需要学习ORM API,你只需要写原生SQL就能拿到开箱即用的Python对象。 - 主流数据库驱动本身也提供类似基础能力:比如PostgreSQL的
psycopg2/psycopg3支持直接指定游标返回namedtuple结构,SQLAlchemy的原生查询接口也可以配置返回非ORM的结构化对象,都可以快速封装出你描述的from_sql接口。
SQL静态分析工具选择
如果要免去手动指定返回类型的步骤,优先选择sqlglot作为SQL解析工具:
- 它是纯Python实现的全功能SQL解析器,支持几乎所有主流数据库的SQL方言,能直接解析SQL的抽象语法树
- 可以通过AST快速判断查询类型:区分是SELECT查询还是DML语句,识别SELECT查询是否带LIMIT 1、是否为无GROUP BY的聚合查询,自动判断返回结果是单行、标量还是多行
- 还可以自动提取SQL中的参数占位符、返回字段名,不需要手动配置。
如果只需要轻量的语法拆分能力,也可以选择更轻量的sqlparse库。
全自动化sql_code -> python function实现思路
你完全可以不需要依赖静态SQL分析就能实现全自动化,推荐的实现流程如下:
- 基础封装层:首先封装统一的数据库执行入口,
from_sql函数接收SQL语句后返回一个动态生成的包装函数 - 首次执行自动推断:包装函数第一次被调用时,执行查询后直接从数据库游标的
description属性中获取返回字段的名称、类型信息,动态生成对应的namedtuple类并缓存 - 结果映射:后续调用同一个包装函数时,直接用缓存好的
namedtuple类映射查询结果返回即可
如果需要做到零调用预先推断返回类型,就可以结合前面提到的sqlglot做静态AST分析,或者提前向数据库发送PREPARE请求获取查询的元数据信息,不需要实际执行查询就能拿到返回字段信息。
内容的提问来源于stack exchange,提问作者winwin
相关产品推荐
相关产品推荐

