资源
资源代表数据库中的实体,您可以从中提取数据,例如表、视图、物化视图和函数(或任意 SQL 表达式)。
类似表的资源没有参数(参数未定义);您可以使用 .get()
或 .find()
从中获取记录。
类似函数的资源有参数(参数是一个数组);使用 .execute()
获取执行函数的结果,并传递任何必需的参数。
PgExecutor
PgExecutor(“执行器”)代表一个 PostgreSQL 数据库连接。它被各种步骤类(通过它们的资源)使用,以便向数据库发出 SQL 查询。您很少会直接调用它的任何方法。
每个资源都只有一个执行器,同一个执行器可以在多个资源之间共享。您的所有资源共享一个执行器非常常见,但多个执行器可以愉快地共存于同一个模式中。
查询内联不能跨越执行器边界(因为每个执行器代表一个单独的数据库,将一个数据库中的查询内联到另一个数据库中没有意义 - 查询很可能在找不到表时抛出错误)。
PgExecutor 还负责缓存等事项。
使用 DEBUG="@dataplan/pg:PgExecutor:verbose"
环境变量查看正在执行的 SQL 查询。(或者将 :verbose
替换为 :explain
如果您想查看更多信息)。
PgExecutor 使用包含两个属性的选项对象构造
name
- 执行器的名称,必须唯一context
- 在规划时调用的回调函数,应该返回一个包含withPgClient
和(可选)pgSettings
条目的对象步骤。有关这些的更多详细信息,请参阅 适配器。
示例
const executor = new PgExecutor({
name: "default",
context() {
return object({
withPgClient: context().get("withPgClient"),
// pgSettings: context().get("pgSettings"),
});
},
});
PgResourceOptions
资源不是直接构造的,而是将资源配置对象(可选地通过注册表构建器)传递给 makeRegistry
,然后构建最终的资源,包括它们的关系。
makePgResourceOptions
函数是一个 TypeScript 标识函数(即它只返回输入,但用于确保类型符合 TypeScript 的要求),因此使用它完全是可选的。
资源选项具有以下属性(除非另有说明,否则所有属性都是可选的)
name
(必填) - 用于此资源的名称,必须唯一executor
(必填) - 用于检索此资源的执行器(除非您连接到多个数据库,否则您可能对每个资源使用相同的执行器)codec
(必填) - 此资源将返回的类型from
(必填) - 对于表状资源,可以是 SQL 片段;对于函数状资源,可以是返回 SQL 片段的回调函数,该函数为数据库提供此资源的FROM
uniques
- 对于表状资源,表上唯一约束的列表(例如,指示主键等)parameters
- 对于函数状资源,必填;对于表状资源,禁止;函数接受的参数规范列表isUnique
- 对于函数状资源,如果此资源最多返回一行,则为 trueisMutation
- 对于函数状资源,如果调用此函数可能产生副作用(即数据库函数为VOLATILE
(默认))则为 true
示例
const forumsResourceOptions = makePgResourceOptions({
name: "forums",
executor,
codec: forumsCodec,
from: sql`forums`,
uniques: [{ attributes: ["id"], isPrimary: true }],
});
PgResource
一旦资源构建完成(来自对 makeRegistry()
的调用的结果 - 请参阅 注册表),您可以使用各种辅助方法
resource.get(spec)
从计划解析器调用此方法;获取一个步骤,该步骤表示来自此表状资源的与给定规范匹配的单个行
resource.find(spec)
从计划解析器调用此方法;获取一个步骤,该步骤表示来自此表状资源的与给定规范匹配的行列表
resource.execute(args)
从计划解析器调用此方法;获取一个步骤,该步骤表示调用此资源表示的数据库函数的结果,并传递给定的参数
resource.getRelations()
获取此资源上可用的关系定义映射(通过在注册表中查找其编解码器)
resource.getRelation(name)
获取命名关系定义