与 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_TOKEN 和 PRESET_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
总之,有三种凭证选项
存储在环境中,作为 PRESET_API_TOKEN 和 PRESET_API_SECRET。
存储在一个名为 credentials.yaml 的用户可读文件中,位置取决于系统。
通过 --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导入和导出资源相同的格式。
生成配置文件的简单方法是,在一个预设工作空间中构建一个或多个仪表板,将它们一起导出,然后将生成的文件解压到目录中。
解压后,目录应如下所示
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/
运行此命令将
读取 dbt 配置文件并在预设工作区中为指定项目创建 $target 数据库。
项目中的每个来源都将创建为预设工作区中的数据集。
项目中的每个模型都将创建为预设工作区中的数据集。
任何 指标 都将添加到相应的数据集中。
在 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的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 30c9cfbd657b8730d110bc3376f72be80ecc840694d831156d8247e311d10920 |
|
MD5 | da72245a09b02af9c68df4642ce2468e |
|
BLAKE2b-256 | 9c4ad5e51fa4ec62710b5fab6943bf93089c76b87c7d08725d63912c7da82005 |
preset_cli-0.2.20-py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9f68076868557116e6c48ccccd1bc916965d4d095937ffabead086eef6ad9c06 |
|
MD5 | 2bf7552129e9435809e3de6f9ee6b3f0 |
|
BLAKE2b-256 | fc228082dbcd7cf57ff0e392892cdca573334a2aaaabdf8c1d570faec23524df |