dbt run-operation 명령어

dbt run-operation 명령어

dbt run-operation 명령어는 매크로를 호출하거나 SQL·Jinja 문자열을 target 데이터베이스에 직접 실행해요. 매크로 기반 작업과 --sql 플래그를 통한 일회성 임시 실행을 지원해요.

출처: 문서

본문

개요

dbt run-operation 명령어는 매크로를 호출하거나 SQL·Jinja 문자열을 target 데이터베이스에 직접 실행하는 데 사용해요. 매크로 기반 작업의 사용법은 operations를 참고하세요.

(dbt v1.12 이상 적용) 매크로를 dbt run-operation으로 호출하면 dbt는 모델 접근·그룹 제어를 강제하지 않아서, ref()로 모든 모델(private·protected 포함)을 참조할 수 있어요. 예를 들어 매크로가 private 모델을 참조할 수 있어요:

{% macro example_macro() %}
  {{ ref('my_private_model') }}
{% endmacro %}

그다음 dbt run-operation으로 그 매크로를 실행할 수 있어요:

dbt run-operation example_macro

사용법

$ dbt run-operation [macro] --args '{args}'
$ dbt run-operation --sql '{sql}'
  • [macro]: 호출할 매크로를 지정해요. dbt는 이 매크로를 제공된 인자로 호출한 다음 종료해요. --sql이 제공되지 않으면 필수예요. --sql과 함께 쓸 수 없어요.
  • --args ARGS: 매크로에 인자를 제공해요. 이 사전(dictionary)은 선택된 매크로에 정의된 키워드 인자에 매핑돼요. 이 인자는 YAML 문자열이어야 해요. 예: '{my_variable: my_value}'. --sql과 함께 쓸 수 없어요.
  • --sql SQL: 매크로 정의 없이 SQL 또는 Jinja 문자열을 target 데이터베이스에 직접 실행해요. 매크로 이름이나 --args와 결합할 수 없어요. dbt v1.12+에서 사용 가능해요.

--sql 플래그 사용

dbt v1.12부터 --sql 플래그를 사용해 매크로를 정의하지 않고 웨어하우스에 임시(ad hoc) 데이터베이스 문장을 직접 실행할 수 있어요. 이 플래그는 테이블 drop·alter, grant 적용, 데이터 수정(data fix) 같은 일회성 작업에 유용해요. 문장은 전체 Jinja 컴파일 파이프라인을 거치므로 ref(), source(), var(), target 및 다른 모든 컨텍스트 변수에 접근할 수 있어요. SQL에 Jinja가 없으면 dbt는 manifest 컴파일을 완전히 건너뛰어 실행이 더 빨라져요.

예를 들어:

# Drop a table in the warehouse
dbt run-operation --sql "DROP TABLE IF EXISTS my_schema.old_table"

# Use Jinja context variables in the statement
dbt run-operation --sql "GRANT SELECT ON {{ target.schema }}.my_table TO reporter"

dbt는 작업이 실행되면서 터미널에 상태 줄을 출력해요:

1 of 1 START executing inline_query ........... [RUN]
1 of 1 OK executed inline_query ............... [SELECT 1 in 0.05s]

작업은 로그에서 inline_query라는 이름으로 표시돼요. 작업이 실패하면 상태 줄은 OK 대신 ERROR를 보여줘요. --sql 플래그는 매크로 이름이나 --args와 결합할 수 없어요.

매크로 대신 --sql을 쓸 때

--sql은 매크로 파일이 필요 없는 빠른 일회성 작업(예: 권한 부여, 테이블 drop, 데이터 수정)에 유용해요. 작업을 여러 환경에서 재사용하거나 팀과 공유해야 한다면 매크로로 작성해서 버전 관리와 테스트가 가능하게 하세요.

커맨드라인 예시

매크로 호출:

# Pass a single argument to a macro
dbt run-operation grant_select --args '{role: reporter}'

# Pass multiple arguments to a macro
dbt run-operation clean_stale_models --args '{days: 7, dry_run: True}'

--sql 플래그 사용:

# Execute DDL
dbt run-operation --sql "CREATE TABLE my_schema.my_table (id int)"

# Grant select on a dbt model using ref()
dbt run-operation --sql "GRANT SELECT ON {{ ref('my_model') }} TO reporter"

더 알아보기 (Learn more)