SQL 与直连
每个组织一个只读数据库:表名是对象类型,列名是属性;一条 SELECT、1 万行、20 秒。

本课目标
读完这一课,你将能够
- 说出 Semantic 数据库的结构:schema、表名、列名、关系表与接口表
- 在 SQL 页写一条合规的查询,用上位置参数
- 说出直连怎么拿,reader 与 public 两个角色各看得见什么
每个组织一个数据库
Semantic 给每个组织一个自己的 Postgres schema,名字是 ont_ 加组织名,例如 AIDC 是 ont_aidc。第一次打开 SQL 页时按需建好;本体的定义变了,下一次查询时自动重建。
里面不复制任何数据:每张表都是一个视图,直接读对象的当前值(数据源的值加上语义层的改动)。已删除的对象、源头已消失的对象不会出现。
一个对象类型一张表
表名 = 对象类型的 API name,列名 = 属性的 API name,例如 organization、modelUsage。一对多的关系直接用外键 join。
多对多关系一张表
两端各一列,列名是 <对象类型>_<关系>,值是走这条关系到达的对象的主键:applicationSdks 里的 application_sdks 是 SDK 的主键。
一个接口一张表
实现它的对象类型合在一起,另有 __objectType 和 __primaryKey 两列。
派生属性不在表里
它们是读的时候沿关系算的;在 SQL 里自己 join,再 count 或 sum。
在 SQL 页写查询
左栏 SQL 打开 SQL Console:左边是表和列,右边是编辑器和结果,Ctrl/⌘ + Enter 执行。两条查 AIDC 自己数据的例子:
-- 每个组织有几位数字员工(派生属性不在表里,自己 join)
SELECT o.name, count(a."agentId") AS agents
FROM organization o
LEFT JOIN agent a ON a."organizationId" = o."organizationId"
GROUP BY o.name
ORDER BY agents DESC
LIMIT 20;
-- 按月汇总模型费用,最近的月份在前
SELECT "month", round(sum("costUsd")::numeric, 2) AS cost_usd, sum(calls) AS calls
FROM "modelUsage"
GROUP BY "month"
ORDER BY "month" DESC;
- 只收一条 SELECT,可以用 WITH、VALUES、TABLE 开头;不能写入,也不能改定义。
- 最多返回 10,000 行,超出会提示截断;20 秒没跑完就取消,加条件或 LIMIT。
- 值用位置参数
$1、$2……和查询分开传(API 是POST /api/v1/sqlQueries/executeOntology的parameters),不要拼进 SQL;不支持 DECLARE 和 SET。
帮我查一下模型费用。
在 cell-aidc 的 Semantic 里用 SQL 查 "modelUsage":按月汇总 "costUsd",只要最近 6 个月,从新到旧,结果给我一张表,不要改任何数据。
直连:psql、BI 工具与 Notebook
本组织的开发者可以在 SQL 页的「连接」里轮换口令,拿到一条只读连接串,用 psql、BI 工具或 Notebook 直连。口令只显示一次;再轮换一次,旧口令立即失效。
aidc semantic database --rotate # 轮换口令,拿到新的连接串(只显示一次)
psql "<连接串>"
\dv -- 列出视图:对象类型、多对多关系、接口各一张
SELECT count(*) FROM "modelUsage";
| reader | public | |
|---|---|---|
| 看得见 | 本组织看得见的全部表 | 只有公开的表(授予了 Everyone) |
| 给谁用 | 本组织成员、开发者 Key、Agent Key、在 Ontology 上有 Viewer 以上角色的人;直连也是它 | 只看得见 Public 的外部账号 |
| 连接数上限 | 10 | 5 |
两个角色都是只读登录,每次查询 20 秒超时:看不到平台自己的表,也看不到别的组织的 schema。SQL 页和 API 按你的身份自动选角色,你不用管。
要点
- 每个组织一个 schema;表名 = 对象类型的 API name,列名 = 属性的 API name。
- 多对多关系一张表,列名
<对象类型>_<关系>;接口一张表,带__objectType。 - 只收一条 SELECT,最多 10,000 行、20 秒;值用
$1传。 - 开发者轮换口令拿只读连接串,用 psql 直连;口令只显示一次。
- reader 看本组织看得见的全部,public 只看公开的。
练一练
写三条查询
在 SQL 页做。没有自己的数据时,打开 AIDC 的 SQL 页,用公开的产品、方案、SDK、模型、课程练。
数一数每个学习对象有几门课:SELECT track, count(*) FROM course GROUP BY track;
先看 "planProducts" 有哪些列,再 join plan 和 product,列出每套方案包含哪些产品。
把一个条件换成 $1,例如按 level 查课程,换两个值看结果怎么变。
小测
选一个答案,马上看解析。
Q1「模型用量」的 API name 是 modelUsage,在 SQL 里表名怎么写?
表名就是 API name,不是显示名;有大写字母就要加双引号,不加会被当成全小写,找不到表。
Q2下面哪条会被 SQL 页拒绝?
只收一条 SELECT(可以 WITH、VALUES、TABLE 开头);要改数据,走 Action。
Q3一个别家公司的账号打开 AIDC 的 SQL 页,能查到哪些表?
它用的是 public 角色,只看得见授予了 Everyone 的表;reader 才看得见本组织的全部。