On this page
dbt Seed Integration
misata dbt-seed generates synthetic data and writes one CSV file per table directly into your dbt seeds/ directory. Run dbt seed afterwards and your data is in the warehouse.
Quick start: from your project's own contract#
Run it bare inside a dbt project and Misata builds the schema from the properties YAML you already have:
cd my-dbt-project
misata dbt-seed # reads models/**/*.yml and seeds/**/*.yml
dbt build # seed + run + test: your own tests, passingThe translation is exact where it matters:
| Your dbt declaration | What Misata generates |
|---|---|
relationships test | A foreign key with guaranteed integrity (zero orphans) |
accepted_values test | A categorical column restricted to exactly those values |
unique test | A unique column (sequential ids for keys) |
not_null test | A column with no nulls |
data_type | The matching column type; date columns are written date-only |
| No type declared | Semantic inference from the name (email, *_date, first_name, amount, …) |
dbt_utils.accepted_range | Hard numeric bounds (min_value/max_value) |
dbt_utils.expression_is_true | ">= 0" becomes a bound; "sale_price <= list_price" becomes a row-level inequality constraint |
dbt_utils.unique_combination_of_columns | A composite-uniqueness constraint |
dbt_utils.not_empty_string | Satisfied by construction (Misata never emits empty strings) |
dbt_utils.relationships_where | An FK with guaranteed integrity (a to_condition is reported as not enforced) |
Both the legacy inline test syntax and the dbt 1.9+ arguments: nesting are parsed. Tests Misata can't translate (other dbt_utils.*, custom generic tests) are listed in the output rather than silently guessed at. If your project declares seeds, those are generated; otherwise the declared models are.
This is verified end-to-end against dbt-duckdb and the real dbt-utils package: on a jaffle-shop-style demo project, dbt build passes 28/28 tests, including model-level relationship tests and dbt-utils generic tests, on data Misata generated from the schema.yml alone.
Quick start: from a story#
No dbt contract yet? Describe the data instead:
# Generate SaaS seed data into dbt's seeds directory
misata dbt-seed --story "A SaaS company with 1k users" --seeds-dir seeds/
# Then load into your warehouse
dbt seedOutput:
✓ users — 1,000 rows → seeds/users.csv
✓ subscriptions — 1,200 rows → seeds/subscriptions.csv
✓ invoices — 3,500 rows → seeds/invoices.csv
Run dbt seed to load 3 table(s) into your warehouse.Options#
| Flag | Default | Description |
|---|---|---|
--from-project | auto | Build the schema from the dbt project's own properties YAML |
--story, -s | : | Plain-English dataset description |
--config, -c | : | Path to a misata.yaml schema file |
--seeds-dir | seeds/ | dbt seeds directory |
--rows, -n | 1000 | Row count for the primary table |
--seed | 42 | Random seed for reproducibility |
--force | False | Overwrite existing CSV files |
Use a YAML schema#
For precise control over column types and distributions, point to a misata.yaml:
misata dbt-seed --config misata.yaml --seeds-dir dbt/seeds/ --rows 5000Recommended workflow#
1. Generate seeds during development#
# In your dbt project root
misata dbt-seed \
--story "An ecommerce store with customers, products, and orders" \
--seeds-dir seeds/ \
--rows 20002. Add seeds to dbt_project.yml#
# dbt_project.yml
seeds:
my_project:
customers:
+column_types:
customer_id: bigint
created_at: timestamp
orders:
+column_types:
order_id: bigint
amount: numeric(10,2)3. Load into your warehouse#
dbt seed
dbt run
dbt testRegenerating seeds#
Seeds are reproducible, same --seed value produces identical data:
# Regenerate with the same data (idempotent)
misata dbt-seed --story "A SaaS company" --rows 1000 --seed 42 --force
# Generate a different dataset variant
misata dbt-seed --story "A SaaS company" --rows 1000 --seed 99 --forceCI/CD integration#
Generate seeds as part of your CI pipeline before running dbt test:
# .github/workflows/dbt.yml
- name: Generate synthetic seed data
run: |
pip install misata
misata dbt-seed \
--story "An ecommerce store with customers and orders" \
--seeds-dir seeds/ \
--rows 500 \
--force
- name: Run dbt
run: |
dbt seed
dbt run
dbt testPython API alternative#
If you need more control, use the Python API directly:
import misata
import pandas as pd
from pathlib import Path
tables = misata.generate("An ecommerce store with 2k customers", rows=2000, seed=42)
seeds_dir = Path("seeds/")
seeds_dir.mkdir(exist_ok=True)
for table_name, df in tables.items():
df.to_csv(seeds_dir / f"{table_name}.csv", index=False)
print(f"Written: {table_name}.csv ({len(df):,} rows)")Related#
- Database Seeding in Python, seed directly into a live database
- SQL DDL to Schema, generate from your existing CREATE TABLE statements
- Export, Parquet, DuckDB, JSONL export options
- Known-answer tests for dbt models, seeds whose correct model output is declared first
- Solve for a pipeline's output, when the model transforms the rows before the number you check
Prefer generating data visually?
Misata Studio lets you turn natural language prompts into relational schemas with exact outcome invariants, live preview tables, and one-click database seeding without writing code.

