如何在同一条 SQL 中查询多个数据库和环境?

在同一条查询里读取其他项目或环境的表,即使一边是 PostgreSQL、另一边是 MySQL。不必在服务器上配置 DB Link。

把两个库的数据对上,或标签页还在预发布却要看生产里的表,通常会把你赶出编辑器。很多 SQL 客户端最后变成导出 CSV、另写脚本,或在服务器上建 DB Link。

DB Link 要在服务器上额外配置和授权,两边引擎不同时更容易失败,比如 PostgreSQL 和 MySQL。

Kerry Studio 让你在同一条查询里读另一条连接上的表。在项目上定义 SQL 别名,再用 @项目.表 引用远程表,例如 @billing.orders。

执行时,Kerry 按对应的已保存连接取行,放到标签页连接上的临时表里。JOIN 在那里跑,不必建 DB Link,也不必在服务器上装东西。PostgreSQL 和 MySQL 之间也是同一套写法。

数据就在编辑器里对上,不必离开这条查询。

如何定义别名

别名写在项目上,字段是 SQL 别名(@alias)。没有这个名字,编辑器无法解析令牌。

需要一个打开的 workspace、项目里填好该字段,以及一个 SQL 标签页。

  1. 在 新建项目 或 编辑项目 对话框里填写别名,例如 billing。栏里不要写 @。@ 只出现在 SQL 里。
  2. 把标签页连接到这条查询应该运行的项目和环境。
  3. 在编辑器里用 @项目.表 代替远程表,例如 @billing.public.orders。
  4. 执行。Kerry 取出行,并在标签页的连接上建成临时表。

命令面板(⌘K / CtrlK)→ 新建连接 会打开同一个项目对话框。

别名在 SQL 里怎么写

别名有两种写法。

@项目.表,例如 @billing.orders,使用标签页当前所在的环境。带 schema 时,路径跟引擎一样:@billing.public.orders。

@项目:环境,例如 @billing:production,使用那个环境,即使标签页在另一个环境。: 只出现在别名和环境之间。后面仍然用 .:@billing:production.public.orders。

schema、表、列都用 .,不用 :。对:@billing.public.orders、@billing:production.public.orders。错:@billing:production:public.orders。

单独的 @名字,没有 .表 也没有 :环境,是 MySQL 用户变量(SET @s)。那不是别名。

@… 由你在项目上定义。已保存的项目之间,别名必须唯一。写成 @项目: 之后,编辑器会列出该项目的环境。写成 @项目:环境. 之后,会列出那条连接上的 schema 和表。

别名不会改标签页上的项目选择器。它只决定这些行从哪里来。如果 SQL 里的名字不是已保存的项目,编辑器会标出这个令牌,执行也会按查询里的名字失败。

同一条查询里的两个项目

常见情况是:标签页连着订单库,客户在另一个已经保存的项目里。

sql
-- 标签页在 shop 项目、预发布环境。
-- @shop.public.orders 跟着标签页。
-- @crm.public.customers 去另一个项目,用标签页的环境。

SELECT
  o.id,
  o.status,
  c.email
FROM @shop.public.orders o
JOIN @crm.public.customers c
  ON c.id = o.customer_id
WHERE o.created_at > current_date - 7;

如果 crm 是 MySQL、标签页在 PostgreSQL,写法一样。Kerry 取出行,JOIN 仍在标签页的连接上执行。

同一条查询里对照预发布和生产

标签页在预发布、你又要同一张表的生产数据时,把环境锁在令牌里。

SQL 里标签页在Kerry 从哪里取
@shop.public.orders预发布shop 项目的预发布
@shop:production.public.orders预发布shop 项目的生产
sql
-- 标签页在 shop 项目、预发布环境。

SELECT
  h.id,
  h.status AS status_staging,
  p.status AS status_production
FROM @shop.public.orders h
JOIN @shop:production.public.orders p
  ON p.id = h.id
WHERE h.status <> p.status;

如果只改标签页的环境,编辑器里的查询不用动。会跟着变的是没有 :环境 的令牌,因为它跟着标签页。带 :production 的令牌仍然指向生产。