SuperAPI AI 工具集

datatables

数据与分析

查看项目

更新于 10-16 13:22

技能介绍

用途

数据表是 Windmill 托管的 PostgreSQL 数据库,由整个工作区共享:脚本、流程和应用通过名称访问它,默认表名为 main。它在工作区设置的 Data Tables 中配置,绝不由 SQL 创建。

变更表结构

开启迁移的数据表,其结构保存为一个有序的、带版本的 SQL 迁移列表,每个迁移包含一个 up 和可选的 down。这个列表由 git 同步和工作区合并携带,并用于在其他工作区重建结构。因此首先要确认该数据表是否开启了迁移:

  • 已开启:每一次结构变更(CREATE、ALTER、DROP 等,行数据除外)都应作为新迁移。用普通 SQL 做的变更只存在于那一个数据库中,历史记录将不再描述它。
  • 未开启:结构变更就是普通 SQL。开启迁移是工作区管理员在 Data Tables 设置中的决定,不应顺带完成。

编写迁移

  • 用 BEGIN; ... END; 包裹语句,使其原子地生效。仅对无法在事务中运行的语句(如 CREATE INDEX CONCURRENTLY)省略外层,此类迁移可能半途失败而部分应用。
  • 当变更可逆时,为其提供可撤销 up 的 down。没有 down 就无法回滚。
  • 在 up 的首行声明它改动的 schema:-- schemas sales, billing,并为每个名称加上 schema 限定(如 sales.orders)。迁移只等待 schema 与其自身重叠的更早迁移。未声明任何 schema 的迁移作用于整个数据库,所有后续迁移都会等待它,因此只有在变更确实横跨数据库(如扩展)时才省略该行。
  • 迁移按最旧优先应用。已应用的迁移不可编辑:用新迁移纠正它。
  • 行数据不是结构。无论是否开启迁移,都用普通 SQL 插入、更新和删除行。

常用命令:

  • wmill datatable migrate new <name> 生成 migrations/datatable/<datatable>/<timestamp>_<name>.up.sql 和 .down.sql
  • wmill datatable migrate up 推送本地文件并应用待处理迁移
  • wmill datatable migrate down 回滚最近一个迁移
  • wmill datatable migrate status 列出迁移

以上命令均接受 -d <datatable>,默认 main。migrate new --schemas sales,billing 会写入 -- schemas 行,migrate up --schema sales 只应用声明该 schema 的待处理迁移。

迁移不是草稿

迁移保存到工作区后,一经应用就会改变数据库,影响所有读取这些表的使用方。若想在不触碰在用表的情况下试用结构:

  • 把新表放在自己的 schema 中(由同一迁移 CREATE SCHEMA IF NOT EXISTS 创建),并让你正在构建的内容指向它。raw app 在其 data config 中指定 schema,因此新应用默认会获得一个新 schema;
  • 或在工作区 fork 中工作,其数据表在创建 fork 时已被克隆(“Clone schema only” 或 “Clone schema and data”):在那里应用的迁移只改动该副本,并在 fork 合并时到达父工作区。保留了原数据表的 fork 指向父数据库,在其中应用的迁移会立即改动父表。

更改或删除其他脚本或应用使用的表不属于以上两种做法:执行前应说明有什么依赖它。

角色与权限

数据表角色是自托管企业版功能,适用于托管 Postgres(实例数据库或外部托管实例)上的数据表。没有角色时,以及始终在使用 Postgres 资源作为后端的数据表上,凡能使用该数据表者都可访问其全部内容:无法承诺按用户、按 schema 或按行的访问控制。

处于角色模式的数据表以 Postgres 角色访问,由 Postgres 强制执行该角色被授予的权限:

  • 角色按数据表分配给用户、组或文件夹。admin 是数据表在引入角色之前的连接:它拥有现有对象并忽略授权;
  • 连接要么指定角色(wmill.datatable('main', { role: 'analyst' })、Python 中的 role='analyst'、datatable://main?role=analyst)并仅持有该角色,要么不指定,由数据表的默认角色解析;
  • 出现 permission denied 表示所用角色缺少授权。应说明是哪个角色、哪个对象:授权由数据表管理员在 Database Manager 的 roles 抽屉中授予。不要切换到 admin 来绕过它;
  • 迁移以其 SQL 首行声明的角色运行:-- role <name>,其 down 中同样如此。未声明任何角色的迁移以 admin 运行,只有可以使用 admin 的人才能这样做。

在设计谁能访问什么之前,请先阅读 https://www.windmill.dev/docs/core_concepts/persistent_storage/data_tables 的 Permissions 部分:其中涵盖 tenant、授权、默认角色、未指定角色的连接最终持有的角色、通过行级安全实现因查看者而异的数据行,以及 fork 和 raw app 在角色下的行为。