如何在预发布和生产环境复用 SQL 中的值而不改写查询?

标签页从预发布换到生产时,限额、筛选和测试值可以改,查询不用重写。值放在变量面板里,并跟着标签页的环境走。

在预发布里,同一条查询要更小的 LIMIT、测试 id、假邮箱或更紧的筛选。生产里这些值又不一样。

没有地方存放的话,数字就被贴进每条语句。标签页从预发布换到生产时,你再手工改。SQL 自带的绑定($1、?)只服务那一次执行。它不会按环境记住一个值,也不会跟着标签页走。

Kerry Studio 用 SQL 中的变量来处理这件事:一个名字绑到值、字面量、$faker. 生成器或一段 SQL。值放在 变量 面板里。执行时 Kerry 换掉令牌,把已经解析好的 SQL 发给数据库。编辑器里的查询不用改。

这不是引擎自带的绑定。这是客户端里的替换。数据库收到的 SQL 里,值已经就位。

怎么创建变量

需要一个打开的 workspace 和一个 SQL 标签页。

从编辑器

  1. 在查询里写 :变量,例如 :限额。
  2. 按空格。
  3. 点名称旁边的 +。
  4. 变量 面板会打开到这一行。填入值,以及类型(如果不是文本)。

从面板

  1. 打开 变量 面板:右侧边栏的图标,或命令面板(⌘K / CtrlK)→ 打开变量面板。
  2. 点击 新建变量。
  3. 填写标识符,不要带 :。
  4. 选择类型、作用域(本地 或 全局),以及正在编辑哪个环境的值(默认 或某个项目环境)。
  5. 填入值。在编辑器里使用 :变量。

本地 只在一个 workspace 里生效。全局 在每个 workspace 里生效。

每个环境一个值

变量有两种写法。

:变量,例如 :限额,使用标签页所处环境的值。如果面板里该环境是空的,就用 默认。

:变量:环境,例如 :限额:production,使用那个环境的值,即使标签页在另一个环境。: 只出现在名称和环境之间。

在 Postgres 里,两个冒号连在一起是类型转换::限额::text 的意思是“变量 限额,转成 text”。这不会选择环境。要指向生产,用 :限额:production。

在面板里,一行就是一个名称。环境选择器不会再创建一条变量。它只切换你正在编辑这一行的哪个值。

如果 限额 在预发布是 50、在生产是 500:

SQL 里标签页在数据库收到
:限额预发布50
:限额:production预发布500
sql
SELECT id, total
FROM orders
WHERE total >= :限额
ORDER BY total DESC;

你在面板里改值,查询不用动。标签页从预发布换到生产,而 SQL 用的是没有锁死环境的 :限额 时,数据库收到的就是 500 而不是 50。

文本、数字或一段 SQL

类型数据库收到什么
文本、数字、布尔、Null对应的字面量
SQL查询里的片段,不加引号

SQL 类型用来存一段 WHERE、JOIN 或表达式,再不加引号地嵌进语句。如果好几条查询共用同一套“有效行”条件:

:active_filter(SQL)= status = 'active'

sql
SELECT *
FROM orders
WHERE :active_filter;

用 $faker. 生成测试数据

变量值里的 $faker. 每次执行都会生成新数据。比如测试邮箱:

:test_email(文本)= $faker.internet.email

sql
INSERT INTO customers (email)
VALUES (:test_email);

$faker. 也可以直接写在 SQL 里($faker.person.fullName)。放进变量后,同一个生成器可以反复用。SQL 里的注释和字符串不会被当成变量。