Ducker Tutorial

View Source
Mix.install([
  {:ducker, "~> 0.2.0"},
  {:adbc, "~> 0.7.9"},
  {:kino, "~> 0.16.0"},
  {:kino_db, "~> 0.3.0"},
  {:kino_explorer, "~> 0.1.24"}
])

Section

Create connection to DuckDB in-memory database

alias Adbc.Connection, as: Conn

:ok = Adbc.download_driver!(:duckdb)
{:ok, db} = Kino.start_child({Adbc.Database, driver: :duckdb})
{:ok, conn} = Kino.start_child({Adbc.Connection, database: db})

# This example uses files in ducker's `priv/example`
work_dir = Path.join(:code.priv_dir(:ducker), "example")

You can attach to DuckDB database file

ATTACH '/path/to/your.db' AS file_db;
USE file_db;

Initialize Ducker to create SQL macros and tables needed by Ducker.

ducker = Ducker.initialize!(conn, work_dir)
# clear validation results
Ducker.reset_validation_results!(ducker)

# run query from `sources` directory
# (relative to `work_dir`)
Ducker.execute_query_file_from_dir!(ducker, "sources")
|> IO.inspect(label: "Executed SQL files")

# run validation from `sources` directory
Ducker.execute_validation_from_dir!(ducker, "sources")
|> IO.inspect(label: "Executed validation")

:ok

View validation result

result2 =
  Explorer.DataFrame.from_query!(
    conn,
    ~S"""
    select * from ducker_validate_result
    where fail_count > 0
    """,
    []
  )
result = Explorer.DataFrame.from_query!(conn, ~S"SUMMARIZE mtcars ", [])