DuckDB データ ソース
はじめに
DuckDB は、高速なローカル分析向けに設計されたインプロセスの分析データベースです。Reveal は DuckDB データベース ファイルと MotherDuck データベースの両方をサポートしているため、同じデータ ソース タイプから埋め込みデータ セット、ローカル ファイル、クラウドでホストされる DuckDB ワークロードを視覚化および分析できます。
サーバー構成
インストール
- ASP.NET
- Node.js
- Node.js - TS
- Java
手順 1 - Reveal DuckDB コネクタ パッケージをインストールします。
ASP.NET アプリケーションの場合、DuckDB サポートを有効にするには、別の NuGet パッケージをインストールする必要があります。
dotnet add package Reveal.Sdk.Data.DuckDB
手順 2 - アプリケーションに DuckDB データ ソースを登録します。
builder.Services.AddControllers().AddReveal( builder =>
{
builder.DataSources.RegisterDuckDB();
});
Node.js アプリケーションの場合、DuckDB データ ソースはメインの Reveal SDK パッケージに含まれています。標準の Reveal SDK セットアップ以外に追加のインストールは必要ありません。
Node.js TypeScript アプリケーションの場合、DuckDB データ ソースはメインの Reveal SDK パッケージに含まれています。標準の Reveal SDK セットアップ以外に追加のインストールは必要ありません。
Java アプリケーションの場合、DuckDB データ ソースはメインの Reveal SDK パッケージに含まれています。標準の Reveal SDK セットアップ以外に追加のインストールは必要ありません。
接続構成
- ASP.NET
- Node.js
- Node.js - TS
- Java
// Create a data source provider
public class DataSourceProvider : IRVDataSourceProvider
{
public async Task<RVDataSourceItem> ChangeDataSourceItemAsync(IRVUserContext userContext, string dashboardId, RVDataSourceItem dataSourceItem)
{
// Required: Update the underlying data source
await ChangeDataSourceAsync(userContext, dataSourceItem.DataSource);
if (dataSourceItem is RVDuckDBDataSourceItem duckDBItem)
{
// Configure specific item properties if needed
if (duckDBItem.Id == "duckdb_orders")
{
duckDBItem.Table = "orders";
duckDBItem.Schema = "main";
// Optional: use a custom query instead of a table
// duckDBItem.CustomQuery = "SELECT * FROM orders WHERE ship_country = 'USA'";
// Optional: call a DuckDB table macro
// duckDBItem.Procedure = "top_customers";
// duckDBItem.ProcedureParameters = new Dictionary<string, object>
// {
// ["min_total"] = 1000
// };
}
}
return dataSourceItem;
}
public Task<RVDashboardDataSource> ChangeDataSourceAsync(IRVUserContext userContext, RVDashboardDataSource dataSource)
{
if (dataSource is RVDuckDBDataSource duckDBDS)
{
// Configure connection properties
duckDBDS.Database = "data\\northwind.duckdb";
duckDBDS.Schema = "main";
// For MotherDuck use:
// duckDBDS.Database = "md:your_database_name";
}
return Task.FromResult(dataSource);
}
}
// Create data source providers
const dataSourceItemProvider = async (userContext, dataSourceItem) => {
// Required: Update the underlying data source
await dataSourceProvider(userContext, dataSourceItem.dataSource);
if (dataSourceItem instanceof reveal.RVDuckDBDataSourceItem) {
// Configure specific item properties if needed
if (dataSourceItem.id === "duckdb_orders") {
dataSourceItem.table = "orders";
dataSourceItem.schema = "main";
// Optional: call a DuckDB table macro
// dataSourceItem.procedure = "top_customers";
// dataSourceItem.procedureParameters = {
// min_total: 1000
// };
}
}
return dataSourceItem;
}
const dataSourceProvider = async (userContext, dataSource) => {
if (dataSource instanceof reveal.RVDuckDBDataSource) {
// Configure connection properties
dataSource.database = "data\\northwind.duckdb";
dataSource.schema = "main";
// For MotherDuck use:
// dataSource.database = "md:your_database_name";
}
return dataSource;
}
// Create data source providers
const dataSourceItemProvider = async (userContext: IRVUserContext | null, dataSourceItem: RVDataSourceItem) => {
// Required: Update the underlying data source
await dataSourceProvider(userContext, dataSourceItem.dataSource);
if (dataSourceItem instanceof RVDuckDBDataSourceItem) {
// Configure specific item properties if needed
if (dataSourceItem.id === "duckdb_orders") {
dataSourceItem.table = "orders";
dataSourceItem.schema = "main";
// Optional: call a DuckDB table macro
// dataSourceItem.procedure = "top_customers";
// dataSourceItem.procedureParameters = {
// min_total: 1000
// };
}
}
return dataSourceItem;
}
const dataSourceProvider = async (userContext: IRVUserContext | null, dataSource: RVDashboardDataSource) => {
if (dataSource instanceof RVDuckDBDataSource) {
// Configure connection properties
dataSource.database = "data\\northwind.duckdb";
dataSource.schema = "main";
// For MotherDuck use:
// dataSource.database = "md:your_database_name";
}
return dataSource;
}
// Create a data source provider
public class DataSourceProvider implements IRVDataSourceProvider {
public RVDataSourceItem changeDataSourceItem(IRVUserContext userContext, String dashboardId, RVDataSourceItem dataSourceItem) {
// Required: Update the underlying data source
changeDataSource(userContext, dataSourceItem.getDataSource());
if (dataSourceItem instanceof RVDuckDBDataSourceItem duckDBItem) {
// Configure specific item properties if needed
if ("duckdb_orders".equals(duckDBItem.getId())) {
duckDBItem.setTable("orders");
duckDBItem.setSchema("main");
// Optional: call a DuckDB table macro
// duckDBItem.setProcedure("top_customers");
}
}
return dataSourceItem;
}
public RVDashboardDataSource changeDataSource(IRVUserContext userContext, RVDashboardDataSource dataSource) {
if (dataSource instanceof RVDuckDBDataSource duckDBDS) {
// Configure connection properties
duckDBDS.setDatabase("data\\northwind.duckdb");
duckDBDS.setSchema("main");
// For MotherDuck use:
// duckDBDS.setDatabase("md:your_database_name");
}
return dataSource;
}
}
Database は、絶対パスと相対パスの両方の DuckDB ファイル パスを受け入れます。ASP.NET の場合、相対パスは AppContext.BaseDirectory を基準に解決されます。MotherDuck の場合は、値を md:databaseName に設定します。
Schema は RVDuckDBDataSource と RVDuckDBDataSourceItem の両方でオプションです。設定しない場合、Reveal は既定の DuckDB スキーマである main を使用します。
DuckDB は、サーバー側でカスタム クエリと DuckDB テーブル マクロをサポートします。詳細については、カスタム クエリ を参照してください。
ChangeDataSourceAsync メソッドでデータ ソースに加えた変更は、ChangeDataSourceItemAsync メソッドには引き継がれません。両方のメソッドでデータ ソースのプロパティを更新する必要があります。上記の例に示すように、ChangeDataSourceItemAsync メソッド内で、データ ソース項目の基になるデータ ソースをパラメーターとして渡して ChangeDataSourceAsync メソッドを呼び出すことをお勧めします。
認証
ローカル DuckDB データベース ファイルでは認証は必要ありません。MotherDuck に接続する場合は、認証プロバイダーを使用してサーバー側で個人用アクセス トークンを提供します。
- ASP.NET
- Node.js
- Node.js - TS
- Java
public class AuthenticationProvider: IRVAuthenticationProvider
{
public Task<IRVDataSourceCredential> ResolveCredentialsAsync(IRVUserContext userContext, RVDashboardDataSource dataSource)
{
IRVDataSourceCredential userCredential = null;
if (dataSource is RVDuckDBDataSource duckDBDS && duckDBDS.Database?.StartsWith("md:") == true)
{
userCredential = new RVPersonalAccessTokenDataSourceCredential("your_motherduck_access_token");
}
return Task.FromResult<IRVDataSourceCredential>(userCredential);
}
}
const authenticationProvider = async (userContext, dataSource) => {
if (dataSource instanceof reveal.RVDuckDBDataSource && dataSource.database?.startsWith("md:")) {
return new reveal.RVPersonalAccessTokenDataSourceCredential("your_motherduck_access_token");
}
return null;
}
const authenticationProvider = async (userContext: IRVUserContext | null, dataSource: RVDashboardDataSource) => {
if (dataSource instanceof RVDuckDBDataSource && dataSource.database?.startsWith("md:")) {
return new RVPersonalAccessTokenDataSourceCredential("your_motherduck_access_token");
}
return null;
}
public class AuthenticationProvider implements IRVAuthenticationProvider {
@Override
public IRVDataSourceCredential resolveCredentials(IRVUserContext userContext, RVDashboardDataSource dataSource) {
if (dataSource instanceof RVDuckDBDataSource duckDBDS && duckDBDS.getDatabase() != null && duckDBDS.getDatabase().startsWith("md:")) {
return new RVPersonalAccessTokenDataSourceCredential("your_motherduck_access_token");
}
return null;
}
}
クライアント側の実装
クライアント側では、データ ソースの id、title、subtitle などの基本プロパティだけを指定する必要があります。実際の DuckDB ファイル パス、MotherDuck データベース名、スキーマ、クエリ構成はサーバー上で行われます。
データ ソースの作成
手順 1 - RevealView.onDataSourcesRequested イベントのイベント ハンドラーを追加します。
const revealView = new RevealView("#revealView");
revealView.onDataSourcesRequested = (callback) => {
// Add data source here
callback(new RevealDataSources([], [], false));
};
手順 2 - RevealView.onDataSourcesRequested イベント ハンドラーで、RVDuckDBDataSource オブジェクトの新しいインスタンスを作成します。title と subtitle プロパティを設定します。RVDuckDBDataSource オブジェクトを作成したら、それをデータ ソース コレクションに追加します。
revealView.onDataSourcesRequested = (callback) => {
const duckDBDS = new RVDuckDBDataSource();
duckDBDS.id = "duckdb_ds";
duckDBDS.title = "My DuckDB Datasource";
duckDBDS.subtitle = "DuckDB";
callback(new RevealDataSources([duckDBDS], [], false));
};
アプリケーションが実行されたら、新しい可視化を作成すると、新しく作成された DuckDB データ ソースが [データ ソースの選択] ダイアログに表示されます。

データ ソース項目の作成
データ ソース項目は、ユーザーが視覚化のために選択できる DuckDB データ ソース内の特定のテーブル、ビュー、または DuckDB テーブル マクロを表します。クライアント側では、ID、タイトル、サブタイトルのみを指定する必要があります。
revealView.onDataSourcesRequested = (callback) => {
// Create the data source
const duckDBDS = new RVDuckDBDataSource();
duckDBDS.id = "duckdb_ds";
duckDBDS.title = "My DuckDB Datasource";
duckDBDS.subtitle = "DuckDB";
// Create a data source item
const duckDBDSI = new RVDuckDBDataSourceItem(duckDBDS);
duckDBDSI.id = "duckdb_orders";
duckDBDSI.title = "Orders";
duckDBDSI.subtitle = "DuckDB";
callback(new RevealDataSources([duckDBDS], [duckDBDSI], false));
};
アプリケーションが実行されたら、新しい可視化を作成すると、新しく作成された DuckDB データ ソース項目が [データ ソースの選択] ダ イアログに表示されます。

その他のリソース
API リファレンス
- ASP.NET
- Node.js
- RVDuckDBDataSource - DuckDB データ ソースを表します
- RVDuckDBDataSourceItem - DuckDB データ ソース項目を表します
- RVDuckDBDataSource - DuckDB データ ソースを表します
- RVDuckDBDataSourceItem - DuckDB データ ソース項目を表します