ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

WrenAI 如何用 dry-plan 查看 SQL 展开为数据库方言的最终语句

WrenAI 如何用 dry-plan 查看 SQL 展开为数据库方言的最终语句 WrenAI 如何用 dry-plan 查看 SQL 展开为数据库方言的最终语句【免费下载链接】WrenAIGenBI (Generative BI) for AI agents, an open-source, governed text-to-SQL through an open context layer that turns natural-language questions into trusted dashboards, charts, and SQL across 20 data sources, such as BigQuery, Snowflake, PostgreSQL, ClickHouse, Amazon Redshift, Databricks and more.项目地址: https://gitcode.com/GitHub_Trending/wr/WrenAI当你基于 MDLModeling Definition Language模型写好一条查询后真正发到数据库执行的并不是你写的那句 SQL而是 Wren Engine 展开、转写后的目标方言 SQL。在连库执行之前用wren dry-plan可以把这条最终 SQL 打印出来它完成模型展开 方言翻译但不建立数据库连接、不返回数据。适用前提是已安装wrenaiPython 包并准备了一份 MDL 文件。准备条件dry-plan 只依赖两样东西MDL 文件和数据源方言不需要连接文件也不需要数据库可连。安装wrenaiQuickstart 用的完整组合是pip install wrenai[memory,main]DuckDB 默认包含其他数据源追加对应 extra如pip install wrenai[postgres]然后用wren version确认安装成功。准备 MDL 文件。默认读取~/.wren/mdl.json也可用--mdl /path/to/mdl.json指定其他位置。数据源方言的确定顺序默认从connection_info.json的datasource字段或活动 profile读取dry-plan是唯一接受--datasource/-d覆盖的命令可以在没有连接文件的情况下指定方言。基本用法最直接的调用wren dry-plan --sql SELECT order_id FROM orders没有连接文件时用-d显式指定目标方言此时完全不需要连接文件wren dry-plan --sql SELECT order_id FROM orders -d postgres--datasource的值即目标数据源方言如duckdb、postgres。命令成功时打印展开后的 SQL 文本失败时向 stderr 输出Error: 原因并以退出码 1 结束见 CLI 实现。输出长什么样CTE 展开机制Wren Engine 的改写流程是解析并限定所有列引用sqlglot→ 识别引用了哪些模型和列 → 逐个把 MDL 模型定义展开成 CTE → 注入你的查询 → 输出目标方言的最终 SQL。以orders模型对应public.orders表列o_orderkey、o_custkey、o_totalprice为例文档示例-- 你写: SELECT o_custkey, SUM(o_totalprice) FROM orders GROUP BY 1 -- dry-plan 输出文档示例: WITH orders AS ( SELECT public.orders.o_orderkey, public.orders.o_custkey, public.orders.o_totalprice FROM public.orders ) SELECT o_custkey, SUM(o_totalprice) FROM orders GROUP BY 1以模型名命名的 CTE 会遮蔽shadow同名模型后续 SQL 就像在查一张表一样运行在这个 CTE 上。展开结果中还能看到 catalog 与 schema 的解析、以 CTE 内联的关系 JOIN、从knowledge/rules/业务规则注入的 policy 过滤以及列级访问控制见 correctness 文档。影响展开结果的四条 SQL 规则用模型名而不是数据库表名——写FROM orders不写FROM public.orders写方言中立的 SQL引擎负责翻译到目标方言列名必须与 MDL 中定义的列名一致不是底层数据库列名isHidden: true的列不出现在SELECT *中关系列也不可被 SELECT跨模型用 JOIN。此外SELECT *、模型间 JOIN、引用模型的子查询、表别名、用户自定义 CTE、RECURSIVEWITH、计算字段、无列的COUNT(*)都在支持范围内详见 wren-sql 参考。Fallback 行为如果 SQL 里没有任何模型引用如SELECT 1或直查裸表改写器不做 CTE 注入而是把整条查询交给 wren-core 的transform_sql()直接转换。所以期望模型展开却没看到 CTE时先检查 FROM 子句用的是不是 MDL 里的模型名。利用失败信息定位问题dry-plan 的价值之一是把 MDL 层的问题与数据库层的问题分开。按 wren-sql 参考 给出的判断表dry-plan 结果含义处理成功输出合法 SQLMDL 层没问题若随后执行失败说明数据库拒绝了翻译后的 SQL拿 DB 报错对照 dry-plan 输出读失败No model references foundFROM 子句没有匹配任何 MDL 模型名核对模型名wren memory fetch -q name --type model --threshold 0失败列错误引用的列在模型中不存在核对列wren memory fetch -q col --model name --threshold 0失败qualify 错误sqlglot 无法解析有歧义或未知的列显式限定为model_name.column_name注意wren memory fetch属于语义检索能力需要先安装memoryextrapip install wrenai[memory]否则该命令不可用。列名写错时 dry-plan 会返回可用列清单缺少关系时会直接说明agent 可以据此重试而不是带着坏 SQL 去执行。dry-plan 成功、执行却失败时的排查把两份输出并排对比你的SQL处替换成同一条查询两边必须一致# 获取展开后的 SQL wren dry-plan --sql 你的SQL 21 # 对数据库执行并捕获报错 wren --sql 你的SQL 21文档给出的常见模式类型不匹配CTE 暴露的是原始列类型目标方言的函数不接受它、底层表在数据库中不存在、DB 用户无权限、方言转换差异较少见通常是 sqlglot 的方言翻译缺口。如果想确认翻译后的 SQL 在真实数据库上能否通过解析与校验不返回行用wren dry-runwren dry-run --sql SELECT * FROM orders LIMIT 1成功打印OK失败打印Error: reason文档示例如Error: table not found ...。它与 dry-plan 的区别dry-run 面向活数据库做校验dry-plan 不碰数据库只做展开。边界与限制dry-plan 只输出 SQL 文本不执行、不返回任何行数据它替代不了对真实库的dry-run校验。方言必须能解析为已知的DataSource否则报Error: unknown datasource 名称。完整命令与默认文件约定~/.wren/mdl.json、~/.wren/connection_info.json见 CLI Referenceagent 工作流中 dry-plan 位于写 SQL 之后、执行之前这一步与wren --sql执行、wren memory store存档共同构成 correctness 描述的防幻觉链路。【免费下载链接】WrenAIGenBI (Generative BI) for AI agents, an open-source, governed text-to-SQL through an open context layer that turns natural-language questions into trusted dashboards, charts, and SQL across 20 data sources, such as BigQuery, Snowflake, PostgreSQL, ClickHouse, Amazon Redshift, Databricks and more.项目地址: https://gitcode.com/GitHub_Trending/wr/WrenAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表