TinkerLab
ARTIFACT // N8N-SAFE-TEXT-TO-SQL.JSON (JSON)

n8n + 本地模型安全自然语言查库工作流(AST 语句拦截 + 只读事务 + 行数熔断) (n8n-safe-text-to-sql.json)

利用本地 Qwen2.5-Coder 将业务问题转化为 SQL,内置正则 AST 语句白名单校验(严禁 DELETE/UPDATE/DROP)与强制 LIMIT 熔断。

[核心实测结论 / TL;DR]本配置包「n8n + 本地模型安全自然语言查库工作流(AST 语句拦截 + 只读事务 + 行数熔断)」(文件名:n8n-safe-text-to-sql.json,格式:JSON)是 Tinker AI 实测工坊配套指南《n8n-sql-readonly-database-analyst》的参数化生产模板。支持在本地浏览器实时定制 Ollama 接口地址 (OLLAMA_URL=http://host.docker.internal:11434)、SQL 生成模型 Tag (SQL_MODEL=qwen2.5-coder:14b)、单次查询最大返回行数 (MAX_SQL_ROWS=100) 等 3 项核心变量,默认遵循 127.0.0.1 回环绑定与最小权限规范。
02 // WORKFLOW无代码工作流· 验证日期:2026-10-26
查看全部 42 套配置附件 →
n8n-safe-text-to-sql.json

n8n + 本地模型安全自然语言查库工作流(AST 语句拦截 + 只读事务 + 行数熔断)

利用本地 Qwen2.5-Coder 将业务问题转化为 SQL,内置正则 AST 语句白名单校验(严禁 DELETE/UPDATE/DROP)与强制 LIMIT 熔断。

查看配套实测指南 →
参数化定制变量 (Variables — 自动保存在本地浏览器)
UTF-8 编码 · 零延迟实时编译
{
  "name": "Tinker AI - Safe Local Text-to-SQL Analyst",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "safe-sql-query",
        "responseMode": "lastNode"
      },
      "name": "Question Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [200, 300]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://host.docker.internal:11434/api/generate",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ model: 'qwen2.5-coder:14b', format: 'json', stream: false, options: { temperature: 0, num_ctx: 8192 }, prompt: 'You are a PostgreSQL read-only analyst. Given schema: orders(id, customer_id, status, amount_cents, created_at). Return JSON {"sql": "SELECT ..."} for question: ' + String($json.body?.question || '').slice(0, 500) }) }}",
        "options": { "timeout": 45000 }
      },
      "name": "Generate SQL via Local Coder",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "retryOnFail": true,
      "maxTries": 2,
      "continueOnFail": true,
      "position": [440, 300]
    },
    {
      "parameters": {
        "jsCode": "const raw = JSON.parse($input.first().json.response || '{}');\nlet sql = String(raw.sql || '').trim().replace(/;+$/, '');\nconst forbidden = /\\b(INSERT|UPDATE|DELETE|DROP|ALTER|TRUNCATE|GRANT|REVOKE|COPY|CREATE|EXEC|INTO|pg_sleep)\\b/i;\nif (!/^SELECT\\b/i.test(sql) || forbidden.test(sql) || sql.includes(';')) {\n  throw new Error('SECURITY_BLOCK: Only single-statement read-only SELECT queries are permitted.');\n}\nif (!/\\bLIMIT\\s+\\d+/i.test(sql)) {\n  sql += ' LIMIT 100';\n}\nreturn [{ json: { verifiedSql: sql } }];"
      },
      "name": "Deterministic SQL AST & Limit Guard",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [680, 300]
    }
  ],
  "connections": {
    "Question Webhook": {
      "main": [[{ "node": "Generate SQL via Local Coder", "type": "main", "index": 0 }]]
    },
    "Generate SQL via Local Coder": {
      "main": [[{ "node": "Deterministic SQL AST & Limit Guard", "type": "main", "index": 0 }]]
    }
  }
}
PARAMETER SPECIFICATION // 参数化变量规范说明表

「n8n-safe-text-to-sql.json」可定制环境变量与默认值说明

本配置模板(JSON 格式)支持 3 项运行时参数注入,所有替换均在本地浏览器内完成。

模板占位符参数用途说明安全默认值填写示例
{{OLLAMA_URL}}Ollama 接口地址http://host.docker.internal:11434http://host.docker.internal:11434
{{SQL_MODEL}}SQL 生成模型 Tagqwen2.5-coder:14bqwen2.5-coder:14b
{{MAX_SQL_ROWS}}单次查询最大返回行数100100
PAIRED HARDWARE MANIFEST // 配套实测环境与边界记录

配套指南《n8n + 本地模型 Text-to-SQL 数据分析工作流:只读事务沙箱、AST 语法拦截与行数熔断》验证基线

实测硬件与操作系统 (Hardware & OS)

Docker n8n 1.76+ · PostgreSQL 16 / MySQL 8 · 本地 Ollama (`qwen2.5-coder:14b`)

锁定软件栈与模型版本 (Pinned Versions)
n8n 1.76.xPostgreSQL 16Ollama 0.5.7qwen2.5-coder:14b
离线与安全边界 (100% 内网闭环(数据库表结构与业务明细零外传))

无论是核心业务表结构(DDL)还是查询出的客户/营收明细,全程在本地内网闭环流转。

已知限制与失败边界 (Known Limits)
  • 高危安全红线:严禁在 Text-to-SQL 节点中复用业务系统的读写主账号(如 `postgres` 超管)!必须创建专用的只读数据库角色(`GRANT SELECT ON ...`)。
  • 上下文信噪比边界:不要把上百张底层表的 DDL 全塞进提示词;应精选 5–8 张核心业务宽表或只读视图(View),并附带字段枚举值注释,实测 SQL 一次可执行通过率可达 94% 以上。
DEPLOYMENT CHECKLIST // 配置落地核验步骤

部署 n8n-safe-text-to-sql.json 后的 3 步验收清单

  1. 已使用开启 `default_transaction_read_only = on` 且带 5 秒超时保护的专用只读数据库账号。
  2. 确认 Code 校验节点已在执行前拦截分号堆叠语句及一切非 SELECT/WITH 关键字。
  3. 已强制追加 `LIMIT 100` 行数熔断,并在提示词中标注了核心状态字段的真实枚举值。