pg_fsql
支持 JSONB 驱动执行的递归 SQL 模板引擎
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_fsql | 1.1.0 | UTIL | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 4110 | pg_fsql | 否 | 是 | 否 | 是 | 否 | 否 | fsql |
| 相关扩展 | plpgsql plpgsql pg_readme schedoc |
|---|
shared_preload_libraries is optional and only needed for session-start GUC availability.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 1.1.0 | 1817161514 | pg_fsql | plpgsql |
| RPM | PIGSTY | 1.1.0 | 1817161514 | pg_fsql_$v | - |
| DEB | PIGSTY | 1.1.0 | 1817161514 | postgresql-$v-pg-fsql | - |
构建
您可以使用 pig build 命令构建 pg_fsql 扩展的 RPM / DEB 包:
pig build pkg pg_fsql # 构建 RPM / DEB 包
安装
您可以直接安装 pg_fsql 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
pig repo add pgsql -u # 添加仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install pg_fsql; # 当前活跃 PG 版本安装
pig ext install -y pg_fsql -v 18 # PG 18
pig ext install -y pg_fsql -v 17 # PG 17
pig ext install -y pg_fsql -v 16 # PG 16
pig ext install -y pg_fsql -v 15 # PG 15
pig ext install -y pg_fsql -v 14 # PG 14
dnf install -y pg_fsql_18 # PG 18
dnf install -y pg_fsql_17 # PG 17
dnf install -y pg_fsql_16 # PG 16
dnf install -y pg_fsql_15 # PG 15
dnf install -y pg_fsql_14 # PG 14
apt install -y postgresql-18-pg-fsql # PG 18
apt install -y postgresql-17-pg-fsql # PG 17
apt install -y postgresql-16-pg-fsql # PG 16
apt install -y postgresql-15-pg-fsql # PG 15
apt install -y postgresql-14-pg-fsql # PG 14
创建扩展:
CREATE EXTENSION pg_fsql CASCADE; -- 依赖: plpgsql
用法
语法:
CREATE EXTENSION pg_fsql; INSERT INTO fsql.templates (path, cmd, body) VALUES ('user_count', 'exec', 'SELECT jsonb_build_object(''total'', count(*)) FROM users WHERE status = {d[status]!r}'); SELECT fsql.run('user_count', '{"status":"active"}');来源:README
pg_fsql 是 PostgreSQL 的递归 SQL 模板引擎。它将 C 级占位符渲染、PL/pgSQL 模板执行、层级化模板组合以及可选的 SPI 计划缓存结合在一起。上游强调它不需要超级用户权限。
核心对象
扩展会安装两个主要目录表:
fsql.templates (
path varchar(500) primary key,
cmd varchar(50),
body text,
defaults text,
cached boolean default false
)
fsql.params (
key_param varchar(255) primary key,
type_param varchar(255) not null
)
path 采用点号分隔,用于定义模板层级。
模板命令
README 记录了六种命令类型:
exec:执行 SQL 并返回jsonbref:重定向到另一个模板if:选择子分支exec_tpl:执行 SQL 后将结果重新渲染为模板map:将子模板收集为 JSON 对象NULL:插入到父模板中的文本片段
占位符
渲染器支持以下占位符:
{d[key]}{d[key]!r},对应quote_literal{d[key]!j},对应 JSONB 字面量{d[key]!i},对应quote_identifier
特殊键 _self 会注入完整的输入 JSON 对象。
公共 API
上游公开函数包括:
fsql.run(path, data, debug):执行模板树fsql.render(path, data):预览渲染后的 SQLfsql.tree(path):查看层级结构fsql.explain(path, data):跟踪展开过程fsql.validate():检查模板fsql.depends_on(path):查看依赖关系fsql.clear_cache():释放缓存的 SPI 计划
示例
INSERT INTO fsql.templates (path, cmd, body) VALUES
('report', 'exec',
'SELECT jsonb_build_object(''data'', array_agg(row_to_json(t)))
FROM (SELECT {d[cols]} FROM {d[src]} {d[where]}) t'),
('report.cols', NULL, 'id, name, email'),
('report.src', NULL, 'customers'),
('report.where', NULL, 'WHERE city = {d[city]!r}');
SELECT fsql.run('report', '{"city":"Moscow"}');
SELECT fsql.render('report', '{"city":"Moscow"}');
需求
README 列出的要求包括 PostgreSQL 14+、plpgsql,以及 gcc、make 和 PostgreSQL server development headers 等标准构建依赖。