【发布时间】:2021-05-18 09:54:40
【问题描述】:
在 Apache 超集中:
我有多个数据库,它们具有相同的确切架构(每个数据库上的不同数据,SaaS 平台的每个客户的数据库)。 我想创建一个仪表板(带有图表、数据集),可以由登录用户的权限填充。 这意味着仪表板将从指定的源数据库中查询数据,而不是预定义的。
前提基本上是从数据库中解耦图表/数据集,并允许其参数化。
【问题讨论】:
在 Apache 超集中:
我有多个数据库,它们具有相同的确切架构(每个数据库上的不同数据,SaaS 平台的每个客户的数据库)。 我想创建一个仪表板(带有图表、数据集),可以由登录用户的权限填充。 这意味着仪表板将从指定的源数据库中查询数据,而不是预定义的。
前提基本上是从数据库中解耦图表/数据集,并允许其参数化。
【问题讨论】:
Superset 并不真正支持这种情况,但我可以想到一种解决方法可能 工作:您可以在您的superset_config.py 中定义一个DB_CONNECTION_MUTATOR 路由到取决于用户的不同数据库。
在你的superset_config.py,添加这个函数:
def DB_CONNECTION_MUTATOR(uri, params, username, security_manager, source):
user = security_manager.find_user(username=username)
if url.database = "db_name" and user and user.email.endswith("@examplea.com"):
uri.host = "host-for-examplea.com"
return uri, params
在上面的函数中,如果用户的电子邮件以 @examplea.com 结尾,我们会将 SQLAlchemy URL 的主机更改为 host-for-examplea.com。
为了让它工作,创建一个默认数据库(在这个例子中我们称之为db_name),并基于它创建所有图表/仪表板。然后,用户应该被DB_CONNECTION_MUTATOR重定向到特定的数据库。
不过,可能发生的一个严重问题是缓存。您应该确保禁用所有缓存,以防止用户看到来自其他数据库的数据。
【讨论】: