About dbt compile command
dbt compile generates executable SQL from source files for:
You can find these compiled SQL files in the target/ directory of your dbt project.
The compile command is useful for:
- Visually inspecting the compiled output of resource files. This is useful for validating complex Jinja logic or macro usage.
- Manually running compiled SQL. While debugging a model or data test, it's often useful to execute the underlying
selectstatement to find the source of the bug. - Compiling
analysisfiles. Read more about analysis files here.
Some common misconceptions:
dbt compileis not a pre-requisite ofdbt run, or other building commands. Those commands will handle compilation themselves.- If you just want dbt to read and validate your project code, without connecting to the data warehouse, use
dbt parseinstead.
Interactive compile
Starting in dbt v1.5, compile can be "interactive" in the CLI, by displaying the compiled code of a node or arbitrary dbt-SQL query:
--selecta specific node by name--inlinean arbitrary dbt-SQL query
This will log the compiled SQL to the terminal, in addition to writing to the target/ directory.
For example:
dbt compile --select "stg_orders"
dbt compile --inline "select * from {{ ref('raw_orders') }}"
returns the following:
dbt compile --select "stg_orders"
21:17:09 Running with dbt=1.7.5
21:17:09 Registered adapter: postgres=1.7.5
21:17:09 Found 5 models, 3 seeds, 20 tests, 0 sources, 0 exposures, 0 metrics, 401 macros, 0 groups, 0 semantic models
21:17:09
21:17:09 Concurrency: 24 threads (target='dev')
21:17:09
21:17:09 Compiled node 'stg_orders' is:
with source as (
select * from "jaffle_shop"."main"."raw_orders"
),
renamed as (
select
id as order_id,
user_id as customer_id,
order_date,
status
from source
)
select * from renamed
dbt compile --inline "select * from {{ ref('raw_orders') }}"
18:15:49 Running with dbt=1.7.5
18:15:50 Registered adapter: postgres=1.7.5
18:15:50 Found 5 models, 3 seeds, 20 tests, 0 sources, 0 exposures, 0 metrics, 401 macros, 0 groups, 0 semantic models
18:15:50
18:15:50 Concurrency: 5 threads (target='postgres')
18:15:50
18:15:50 Compiled inline node is:
select * from "jaffle_shop"."main"."raw_orders"
The command accesses the data platform to cache-related metadata, and to run introspective queries. Use the flags:
--no-populate-cacheto disable the initial cache population. If metadata is needed, it will be a cache miss, requiring dbt to run the metadata query. This is adbtflag, which means you need to adddbtas a prefix. For example:dbt --no-populate-cache.--no-introspectto disable introspective queries. dbt will raise an error if a resource's definition requires running one. This is adbt compileflag, which means you need to adddbt compileas a prefix. For example:dbt compile --no-introspect.
Compiled SQL for resources that use introspective queries may depend on metadata from your warehouse. Compilation may be incomplete or may differ depending on the state of that metadata.
Compiling tests with --select
You can use dbt compile to compile tests, as long as your selector matches a test node in the project.
You can also target groups of tests with selector methods:
Compile all test nodes:
dbt compile --select "resource_type:test"
Compile only generic tests:
dbt compile --select "test_type:generic"
Compile only singular tests:
dbt compile --select "test_type:singular"
If dbt returns selection does not match any nodes, your selector did not match a discovered node. To troubleshoot:
- List tests for a model selector:
dbt ls --resource-type test --select "MODEL_NAME"
- Copy one of the returned test node names into
dbt compile --select:
dbt compile --select "TEST_NODE_NAME"
For example, a returned test node name may look like this:
FULL_TEST_NODE_NAME
- If no tests are returned, check test definitions and project paths before running
compileagain.
For more selector patterns, refer to Test selection examples.
FAQs
Was this page helpful?
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.