如何在预发布和生产环境复用 SQL 中的值而不改写查询?
标签页从预发布换到生产时,限额、筛选和测试值可以改,查询不用重写。值放在变量面板里,并跟着标签页的环境走。
在预发布里,同一条查询要更小的 LIMIT、测试 id、假邮箱或更紧的筛选。生产里这些值又不一样。
没有地方存放的话,数字就被贴进每条语句。标签页从预发布换到生产时,你再手工改。SQL 自带的绑定($1、?)只服务那一次执行。它不会按环境记住一个值,也不会跟着标签页走。
Kerry Studio 用 SQL 中的变量来处理这件事:一个名字绑到值、字面量、$faker. 生成器或一段 SQL。值放在 变量 面板里。执行时 Kerry 换掉令牌,把已经解析好的 SQL 发给数据库。编辑器里的查询不用改。
这不是引擎自带的绑定。这是客户端里的替换。数据库收到的 SQL 里,值已经就位。
怎么创建变量
需要一个打开的 workspace 和一个 SQL 标签页。
从编辑器
- 在查询里写
:变量,例如:限额。 - 按空格。
- 点名称旁边的 +。
- 变量 面板会打开到这一行。填入值,以及类型(如果不是文本)。
从面板
- 打开 变量 面板:右侧边栏的图标,或命令面板(⌘K / CtrlK)→ 打开变量面板。
- 点击 新建变量。
- 填写标识符,不要带
:。 - 选择类型、作用域(本地 或 全局),以及正在编辑哪个环境的值(默认 或某个项目环境)。
- 填入值。在编辑器里使用
:变量。
本地 只在一个 workspace 里生效。全局 在每个 workspace 里生效。
每个环境一个值
变量有两种写法。
:变量,例如 :限额,使用标签页所处环境的值。如果面板里该环境是空的,就用 默认。
:变量:环境,例如 :限额:production,使用那个环境的值,即使标签页在另一个环境。: 只出现在名称和环境之间。
在 Postgres 里,两个冒号连在一起是类型转换::限额::text 的意思是“变量 限额,转成 text”。这不会选择环境。要指向生产,用 :限额:production。
在面板里,一行就是一个名称。环境选择器不会再创建一条变量。它只切换你正在编辑这一行的哪个值。
如果 限额 在预发布是 50、在生产是 500:
| SQL 里 | 标签页在 | 数据库收到 |
|---|---|---|
:限额 | 预发布 | 50 |
:限额:production | 预发布 | 500 |
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'
SELECT *
FROM orders
WHERE :active_filter;用 $faker. 生成测试数据
变量值里的 $faker. 每次执行都会生成新数据。比如测试邮箱:
:test_email(文本)= $faker.internet.email
INSERT INTO customers (email)
VALUES (:test_email);$faker. 也可以直接写在 SQL 里($faker.person.fullName)。放进变量后,同一个生成器可以反复用。SQL 里的注释和字符串不会被当成变量。