跳转到主要内容

与 Preset (https://preset.io/) 工作空间交互的命令行工具。

项目描述

与 Preset 工作空间交互的命令行工具。

此工具是用于与您的 Preset 工作空间交互的命令行界面(CLI)。目前,它可以用于从源控制同步资源(数据库、数据集、图表、仪表板),无论是原生格式还是来自 dbt 项目。它还可以用于对任何工作空间中的任何数据库运行 SQL。在未来,CLI 还将允许您管理您的工作空间和用户。

安装

使用 pip 安装 CLI

$ pip install -U setuptools setuptools_scm wheel  # for good measure
$ pip install preset-cli

请确保您正在使用 Python 3.8 或更高版本。

如果您需要最新的功能,也可以从 main 安装

$ pip install "git+https://github.com/preset-io/backend-sdk.git"

身份验证

CLI 需要用于身份验证的 API 密钥,由令牌和相关密钥组成。两者都可以在您的环境中定义为 PRESET_API_TOKENPRESET_API_SECRET,或者可以存储在配置文件中。要将凭证存储在配置文件中,只需运行 preset-cli auth。这应该在您的浏览器中打开 https://manage.app.preset.io/app/user,以便您生成新的令牌,并且它会提示您输入令牌及其密钥

% preset-cli auth
Please generate a new token at https://manage.app.preset.io/app/user if you don't have one already
API token: 35dac901-c775-43ff-8eb4-816edc061487
API secret: [will not echo]
Credentials stored in /Users/beto/Library/Application Support/preset-cli/credentials.yaml

凭证将存储在系统相关位置,在一个只有您才能读取的文件中。

此步骤是可选的。如果您尝试在不定义环境中的令牌/密钥或在预期位置存储它们的情况下运行 CLI,系统将提示您输入它们

% preset-cli superset sql
You need to specify a JWT token or an API key (name and secret)
API token: 35dac901-c775-43ff-8eb4-816edc061487
API secret: [will not echo]
Store the credentials in /Users/beto/Library/Application Support/preset-cli/credentials.yaml? [y/N]

您还可以直接将令牌/密钥(甚至是 JWT 令牌)作为选项传递

% preset-cli --api-token 35dac901-c775-43ff-8eb4-816edc061487 --api-secret XXX superset sql
% preset-cli --jwt-token XXX superset sql

总之,有三种凭证选项

  1. 存储在环境中,作为 PRESET_API_TOKENPRESET_API_SECRET

  2. 存储在一个名为 credentials.yaml 的用户可读文件中,位置取决于系统。

  3. 通过 --api-token--api-secret(或 --jwt-token)选项直接传递给CLI。

工作空间

CLI可以对一个或多个预设工作空间(Apache Superset实例)运行命令。当运行命令时,可以通过将逗号分隔的URL列表传递给 --workspaces 选项来指定工作空间

% preset-cli \
> --workspaces=https://abcdef12.us1a.app.preset.io/,https://34567890.us1a.app.preset.io/ \
> superset sql

如果您省略了 --workspaces 选项,您将进行交互式提示

% preset-cli superset sql
Choose one or more workspaces (eg: 1-3,5,8-):

# Team 1 #
 (1) The Data Lab
🚧 (2) New workspace

# Dev #
⤴️ (3) Test workspace

每个工作空间都有一个表示其状态的图标

  • ✅ 已准备好

  • 📊 正在加载示例

  • 💾 创建/初始化元数据库

  • 🚧 迁移元数据库

  • 🕵️ 迁移密钥

  • ⤴️ 升级工作空间

  • ❗️ 错误

  • ❓ 未知状态

您可以使用逗号分隔的数字和/或范围来指定一个或多个工作空间

  • 1: 工作空间1

  • 1,3: 工作空间1和3

  • 1,3-5: 工作空间1, 3, 4和5

  • -3: 工作空间1, 2和3

  • 1-: 所有工作空间

  • -: 所有工作空间

命令

以下命令目前可用

  • preset-cli auth:存储身份验证凭据。

  • preset-cli invite-users:邀请用户加入Preset。

  • preset-cli import-users:自动将用户添加到Preset。

  • preset-cli list-group-membership:列出团队中的SCIM组及其成员资格。

  • preset-cli superset sql:交互式或以编程方式在分析数据库中运行SQL。

  • preset-cli superset export-assets(或 preset-cli superset export):将资源(数据库、数据集、图表、仪表板)作为YAML文件导出到目录中。

  • preset-cli superset export-ownership:将资源所有权(UUID -> email)导出到YAML文件中。

  • preset-cli superset export-rls:将RLS规则导出到YAML文件中。

  • preset-cli superset export-roles:将用户角色导出到YAML文件中。

  • preset-cli superset export-users:将用户(姓名、用户名、电子邮件、角色)导出到YAML文件中。

  • preset-cli superset sync native(或 preset-cli superset import-assets):从模板配置文件目录同步工作空间。

  • preset-cli superset sync dbt-core:从dbt Core项目同步工作空间。

  • preset-cli superset sync dbt-cloud:从dbt Cloud项目同步工作空间。

所有 superset 子命令也可以通过使用 superset-cli 命令针对独立Superset实例执行。这意味着如果您正在运行一个位于 https://superset.example.org/ 的Superset实例,您可以使用以下命令导出其资源

% superset-cli https://superset.example.org/ export-assets /path/to/directory

然后,使用以下命令将所有内容导入到Preset工作空间中

% preset-cli superset sync native /path/to/directory

运行SQL

CLI提供了一种简单的方式来在工作空间中运行SQL分析数据库。这可以通过程序化或交互式方式进行。例如,给定工作空间URL和数据库名称,要运行查询 SELECT COUNT(*) AS revenue FROM sales,您可以运行

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ superset sql \
> --database-id=1 -e "SELECT COUNT(*) AS revenue FROM sales"

https://abcdef12.us1a.app.preset.io/
  revenue
---------
       42

如果您没有指定数据库名称,您将看到可用的数据库列表以供选择。如果您没有通过-e选项指定SQL查询,CLI将启动一个简单的REPL(读取-评估-打印循环),您可以在其中交互式地运行查询。

从导出同步

您可以使用CLI管理工作空间资源(数据库、数据集、图表和仪表板)的源代码控制。配置应存储为YAML文件,使用Apache Superset导入和导出资源相同的格式。

生成配置文件的简单方法是,在一个预设工作空间中构建一个或多个仪表板,将它们一起导出,然后将生成的文件解压到目录中。

https://github.com/preset-io/preset-cli/raw/master/docs/images/export_dashboards.png

解压后,目录应如下所示

  • charts/

  • dashboards/

  • databases/

  • datasets/

  • metadata.yaml

您可以在这里看到一个示例。

要将这些文件同步到预设工作空间,您只需运行

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/

如果任何资源已存在,您需要传递--overwrite标志以替换它们。如果未传递标志,CLI将警告您任何已存在的资源。

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/
Error importing database
The following file(s) already exist. Pass --overwrite to replace them.
- databases/Google_Sheets.yaml
Error importing dataset
The following file(s) already exist. Pass --overwrite to replace them.
- datasets/Google_Sheets/country_cnt.yaml
Error importing chart
The following file(s) already exist. Pass --overwrite to replace them.
- charts/Total_count_134.yaml
Error importing dashboard
The following file(s) already exist. Pass --overwrite to replace them.
- dashboards/White_label_test.yaml

通过将--disallow-edits标志传递给命令,可以将同步的资源标记为“外部管理”。当传递此标志时,用户将无法编辑资源。还可以提供资源的修改URL,例如,指向GitHub存储库中的文件的链接。这可以通过传递--external-url-prefix标志来完成。

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/ --disallow-edits \
> --external-url-prefix=https://github.com/org/project/blob/master/

这样,文件dashboards/White_label_test.yaml将有一个指向https://github.com/org/project/blob/master/dashboards/White_label_test.yaml的外部URL。目前,此URL尚未在任何地方显示,但在不久的将来,我们应该从实例UI中提供指向它的便捷途径。

使用模板

此命令最强大的功能之一是,YAML配置文件被视为Jinja2模板,允许您参数化同步文件。例如,想象一个简单的图表,如下所示

slice_name: Total sales
viz_type: big_number_total
params:
  metric: sum__sales
  adhoc_filters: []

该图表显示指标sum__sales,表示给定产品的总(未过滤)销售额。我们可以将图表配置更改如下

{% if country %}
slice_name: Sales in {{ country }}
{% else %}
slice_name: Total sales
{% endif %}
viz_type: big_number_total
params:
  metric: sum__sales
  {% if country %}
  adhoc_filters:
    - clause: WHERE
      expressionType: SQL
      sqlExpression: country = '{{ country }}'
      subject: null
      operator: null
      comparator: null
  {% else %}
  adhoc_filters: []
  {% endif %}

现在,如果设置了country参数,则图表将具有不同的标题和额外的过滤器。可以通过命令行传递多个参数

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/ -o country=BR

模板还可以通过instance变量(一个URL对象)访问工作空间名称。

params:
  metric: sum__sales
  adhoc_filters:
    - clause: WHERE
      expressionType: SQL
      {% if instance.host == '//abcdef12.us1a.app.preset.io/ %}
      sqlExpression: warehouse_id = 1
      {% elif instance.host == '//34567890.us1a.app.preset.io/ %}
      sqlExpression: warehouse_id = 2
      {% else %}
      sqlExpression: warehouse_id = 3
      {% endif %}

您还可以通过传递--load-env(或-e)标志从环境中加载变量。

database_name: Postgres
sqlalchemy_uri: postgres://{{ env["POSTGRES_HOSTNAME"] }}

最后,如下一节所示,模板可以利用用户定义的函数。

用户定义的函数

您可以在配置模板中使用自定义函数。只需在存储配置文件的目录中创建一个名为 functions/ 的子目录,并添加一个或多个 Python 文件。以下是一个简单的示例,想象一个名为 functions/demo.py 的文件,其内容如下

# functions/demo.py
def hello_world() -> str:
    return "Hello, world!"

然后可以通过以下方式从任何模板调用该函数

slice_name: {{ functions.demo.hello_world() }}
viz_type: big_number_total
params:
  ...

禁用 Jinja 模板

CLI 和 Superset 都支持 Jinja 模板。为了防止 CLI 加载 Superset Jinja 语法,导出操作会自动从 YAML 文件中转义 Jinja 语法。因此,以下查询

sql: 'SELECT action, count(*) as times
    FROM logs
    {% if filter_values(''action_type'')|length %}
        WHERE action is null
        {% for action in filter_values(''action_type'') %}
            or action = ''{{ action }}''
        {% endfor %}
    {% endif %}
    GROUP BY action'

变为以下内容

sql: 'SELECT action, count(*) as times
    FROM logs
    {{ '{% if' }} filter_values(''action_type'')|length {{ '%}' }}
        WHERE action is null
        {{ '{% for' }} action in filter_values(''action_type'') {{ '%}' }}
            or action = ''{{ '{{' }} action {{ '}}' }}''
        {{ '{% endfor %}' }}
    {{ '{% endif %}' }}
    GROUP BY action'

在执行导入时,CLI 会加载任何未转义的模板语法,并移除转义。然而,这种转义语法与 UI 导入不兼容。为了避免在使用 CLI 和 UI 运行迁移时出现问题,您可以使用

  • --disable-jinja-escaping 标志与 export-assets 命令来禁用转义(以便可以通过 UI 导入导出的资源)

  • --disable-jinja-templating 标志与 sync native 命令来禁用 Jinja 模板(以便可以通过 CLI 导入通过 UI 导出的资源)

请注意,使用这些标志将删除通过 CLI 动态修改内容的能力。

与 dbt 同步

CLI 还允许您从 dbt 项目同步模型和指标。

如果您使用 dbt Core,您可以指定 CLI 到您的编译清单和配置文件,这样就会自动创建数据库,以及所有模型和指标。完整命令是

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync dbt-core /path/to/dbt/my_project/target/manifest.json \
> --project=my_project --target=dev --profiles=${HOME}/.dbt/profiles.yml \
> --exposures=/path/to/dbt/my_project/models/exposures.yaml \
> --import-db \
> --external-url-prefix=http://localhost:8080/

运行此命令将

  1. 读取 dbt 配置文件并在预设工作区中为指定项目创建 $target 数据库。

  2. 项目中的每个来源都将创建为预设工作区中的数据集。

  3. 项目中的每个模型都将创建为预设工作区中的数据集。

  4. 任何 指标 都将添加到相应的数据集中。

  5. 在 dbt 源和/或模型之上构建的每个仪表板都将同步回 dbt,作为一个 暴露

描述、标签和其他元数据也将从 dbt 模型同步到数据集的相应字段。还可以直接在模型定义下指定仅适用于 Superset 的字段的值,在 model.meta.superset.{{field_name}} 下。例如,要指定数据集的缓存超时

models:
  - name: my_dbt_model
    meta:
      superset:
        cache_timeout: 250 # Setting the dataset cache timeout to 250.

对于指标也是如此。例如,要指定指标的 d3 格式

- name: avg_revenue
  label: "AVG Revenue"
  model: ref('my_dbt_model')
  calculation_method: average
  expression: price_each
  timestamp: date
  meta:
    superset:
      d3format: '%d'

--external-url-prefix 应指向您的 dbt 文档,以便工作区中的资源可以指向它们被管理的真实来源。与原生同步类似,dbt 同步也支持 --disallow-edits 标志。

默认情况下,CLI 同步会在目标工作区使用以下名称结构创建一个新数据库

f"{project_name}_{target_name}"

如果您想将数据同步到工作区上的现有数据库连接,您可以在配置文件中的 <target-name> 下指定数据库连接名称

meta:
  superset:
    database_name: my DB name # <= specify the database connection/display name used on the workspace

示例

jaffle_shop:
  outputs:
    dev:
      meta:
        superset:
          database_name: Postgres - Production

如果传递了 --import-db 并且在工作区上找到了数据库连接,则操作会使用 dbt 连接设置更新连接配置。

如果您正在使用 dbt Cloud,您还可以通过传递一个作业 ID 和一个 服务账户访问令牌 来代替。

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync dbt-cloud \
> $TOKEN $JOB_ID \
> --external-url-prefix=http://localhost:8080/

令牌只需要访问您项目中的“仅元数据”权限集。您可以通过访问 dbt Cloud 中的项目 URL 并查看 URL 中的最后一个 ID 来查看作业 ID。例如,如果 URL 是 https://cloud.getdbt.com/#/accounts/12345/projects/567890/jobs/,则作业 ID 为 567890。

从 dbt Cloud 同步时,数据库连接必须在目标工作区中已经存在。工作区上的连接显示名称必须与 dbt Cloud 中的数据库名称匹配。

选择模型

默认情况下,所有模型都将同步到工作区。CLI 支持使用与 dbt 命令行类似的语法子集来选择要同步的模型。可以通过 --select 标志指定要同步的模型

% preset-cli ... --select my_model    # sync only "my_model"
% preset-cli ... --select my_model+   # sync "my_model" and its children
% preset-cli ... --select my_model+2  # sync "my_model" and its children up to 2 degrees
% preset-cli ... --select +my_model   # sync "my_model" and its parents
% preset-cli ... --select +my_model+  # sync "my_model" with parents and children

可以通过重复 --select 标志来传递多个选择器(请注意,这与 dbt 略有不同,dbt 不需要重复该标志)

% preset-cli ... --select my_model --select my_other_model

CLI 还支持交集运算符

% preset-cli ... --select my_model+,tag:test

上面的命令将同步具有“test”标签的 my_model 和其子模型。

最后,CLI 还以类似的方式支持 --exclude 标志

% preset-cli --select my_model+ --exclude tag:test

上面的命令将同步没有“test”标签的“my_model”及其子模型。

导出资源

CLI 还可以用来从给定的预设工作区(使用 preset-cli)或 Superset 实例(使用 superset-cli)导出资源(数据库、数据集、图表和仪表板)。这对于在工作区之间迁移资源、从现有的 Superset 安装迁移到 Preset,甚至从 Preset 迁移到 Superset(Preset 的一个优点是无需供应商锁定!)非常有用。

要从自托管 Superset 实例导出资源

% superset-cli https://superset.example.org/ export /path/to/directory

这将在 /path/to/directory 中创建一个漂亮的目录结构,准备好使用 sync native 命令导入。

要从预设工作区导出资源

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset export /path/to/directory

还可以使用 CLI 导出特定资源

使用 --asset-type 来导出给定类型的所有资产。可用选项

  • 仪表板

  • 图表

  • 数据集

  • 数据库

例如,运行以下命令将导出此工作区中的所有仪表板(不会包括数据集、图表和数据库连接)

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset export /path/to/directory --asset-type=dashboard

使用 --asset-ids 来过滤特定资产。可用选项

  • 仪表板-ids

  • 图表-ids

  • 数据集-ids

  • 数据库-ids

例如,运行以下命令将从这个工作区中导出指定的仪表板(包括数据集、图表和数据库连接)

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset export /path/to/directory --dashboard-ids=9,10

要将导出的资源导入到预设工作区中

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory

最后,要将资源导入到独立的 Superset 实例中

% superset-cli https://superset.example.org/ sync native /path/to/directory

请注意,任何现有的 Jinja2 模板标记都将被转义。例如,如果您有一个定义为

SELECT action, count(*) as times
FROM logs
WHERE
    action in {{ filter_values('action_type')|where_in }}
GROUP BY action

的虚拟数据集

SELECT action, count(*) as times
FROM logs
WHERE
    action in {{ '{{' }} filter_values('action_type')|where_in }} '}}' }}
GROUP BY action

生成的 YAML 文件将具有以下查询定义

这样,当由 preset-cli superset sync native 处理时,原始 Jinja2 将正确重建。

preset-cli superset export-users 命令可以用来导出用户列表。然后可以通过 preset-cli import-users 命令将这些用户导入到 Preset。

您还可以通过 preset-cli superset export-roles 导出角色,并通过 import-roles 导入。

导出RLS规则

可以使用 preset-cli superset export-rls 命令导出RLS规则列表。目前还没有将其导入工作空间的方法,但相关工作正在进行中。

导出所有权

preset-cli superset export-ownership 命令生成一个包含不同资源所有权信息的YAML文件。该文件将资源UUID映射到用户电子邮件地址,未来将用于在Superset的不同实例上重新创建所有权。

列出SCIM组

preset-cli list-group-membership 命令打印与Preset团队关联的所有SCIM组(包括成员)。而不是在终端上打印结果(这可能对快速故障排除很有用),可以使用 --save-report=yaml--save-report=csv 将结果写入文件。文件名将是 {TeamSlug}__user_group_membership.{FileExtension}

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。

源分布

preset_cli-0.2.20.tar.gz (445.8 kB 查看散列值)

上传时间

构建分布

preset_cli-0.2.20-py3-none-any.whl (72.6 kB 查看散列值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面