自定义操作

编写 SQL 以更新数据库中的记录。

Custom action

创建自定义操作

您必须属于拥有原生查询编辑访问权限的组才能创建操作。

  1. 首先,创建模型
  2. 访问模型并点击 信息 按钮。
  3. 点击 操作 选项卡。

在操作编辑器中,您可以编写自己的代码来创建操作,例如编写一个只更新表中部分列的操作。请参阅 示例操作

操作变量的字段类型

对于您在操作中设置的每个 {{ variable }},您都需要设置字段类型。

每个变量字段类型都提供不同的选项。点击齿轮图标更改选项。

如果您不需要某个变量,可以选择为 Metabase 指定一个默认值,供用户未填写该字段时使用。在 SQL 代码中,请记住将任何可选变量和逗号用方括号括起来,例如 [[, column = {{ optional_variable }}]]

您可以在操作表单中为所有字段包含占位符文本。

文本

  • 文本
  • 长文本
  • 下拉列表
  • 内联选择

数字

  • 数字
  • 下拉列表
  • 内联选择

日期

  • 日期
  • 日期 + 时间

对于 下拉列表内联选择,您可以指定一个选项列表,显示在表单上,每个选项占一行。

Dropdown select

外观

操作模态框中的外观选项卡将显示变量表单元素的预览。在下图中,我们点击了变量的 齿轮 图标,并将变量设置为使用文本 > 下拉列表。外观部分提供了表单元素的外观预览。

Appearance gives a preview of the form element

操作设置

从模型详情页面,点击操作旁边的 三点菜单 (...)。进入操作编辑器后,点击 齿轮 图标以调出操作设置。

公开

创建操作表单的公开分享链接。任何能够访问该链接的人都可以填写表单并运行操作。适用于创建调查。

Public action form

设置成功消息

在此,您可以编辑成功消息,这是 Metabase 在数据库确认一切顺利后显示的弹出消息。

如果出现问题,Metabase 将显示从数据库收到的错误消息。

示例自定义操作

示例 UPDATE 操作

您可以编写一个操作来更新示例数据库中 invoices 表记录的 plan 列。


UPDATE invoices
SET plan = {{ plan }}
   [[, payment = {{ payment }}]]
WHERE
   id = {{ id }}

上述代码将创建一个表单,提示用户输入(必需的)plan 字段以及可选的 payment 字段,以更新由 ID 指定的给定记录。

方括号中的代码 [[ ]] 使语句成为可选:仅当有人在 payment 字段中输入值时,方括号内的语句才会运行。请注意,分隔语句的逗号位于方括号 *内部*。

Example action form

示例 INSERT 操作

插入语句非常直接。


INSERT INTO invoices (
  account_id
  ,payment
  ,expected_invoice
  ,plan
  ,date_received
)
VALUES (
  {{ account_id }}
  ,{{ payment }}
  ,CAST ({{expected_invoice}} AS boolean)
  ,{{plan}}
  ,({{date_received}}
);

在操作中强制转换字段值

如果在提交表单时收到类型错误,您可能需要对查询中的数据类型进行 CAST,使其与数据库中目标字段的数据类型匹配。这里我们将一个值强制转换为 boolean


UPDATE invoices
SET expected_invoice = CAST({{expected_invoice}} AS boolean)
WHERE id = {{id}};

在操作中引用已保存的查询

您也可以在操作中引用已保存的查询。这里我们将一个已保存的查询(“潜在客户”)的 SELECT 语句结果插入到 people_to_write 表中。


WITH prospects AS {{#6-potential-customers}}

INSERT INTO
  people_to_write (
  first_name
  ,last_name
  ,email
  )
SELECT
  first_name
  ,last_name
  ,email
FROM prospects;

延伸阅读

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档? 提议更改。
© . This site is unofficial and not affiliated with Metabase, Inc.