dbt是否默认读取.env文件?环境变量读取异常问题咨询
问题解答:dbt优先读取上级目录.env文件而非系统环境变量
这不是dbt的新增特性,dbt从v1.0版本开始就支持自动加载.env文件,背后是依赖python-dotenv包的默认行为,具体逻辑如下:
核心原因
dbt启动时会自动从当前工作目录开始向上遍历所有父目录,查找并加载.env文件中的环境变量,这些加载的变量优先级会高于系统已设置的环境变量。你本地的PSQLHOST虽然设为127.0.0.1,但上级目录的.env里存了旧值postgres_hosting_service,所以dbt优先用了这个值。
关键细节
- dbt的.env加载规则:会从
dbt_project.yml所在的项目根目录向上查找,直到用户主目录为止,所有找到的.env文件都会被加载;若存在多个同名变量,更靠近项目目录的.env值会覆盖上级目录的,但所有.env里的变量优先级都高于系统环境变量。 - 禁用自动加载:如果不想让dbt加载上级目录的
.env,可以设置环境变量DBT_ENV_FILE=False,这样dbt就只会读取系统环境变量。
验证步骤
- 重命名上级目录的
.env文件(比如改成.env.old) - 重新执行
poetry run dbt debug --connection,此时会读取系统环境变量的127.0.0.1 - 也可以通过
poetry run dbt run --debug查看日志,里面会明确显示dbt加载了哪些.env文件
你提供的命令输出与配置文件
dbt debug输出
$ poetry run dbt debug --connection 20:49:42 Running with dbt=1.8.8 20:49:42 dbt version: 1.8.8 20:49:42 python version: 3.12.7 20:49:42 python path: /home/user/path_to_proj_dir/.venv/bin/python 20:49:42 os info: Linux-5.15.0-125-generic-x86_64-with-glibc2.31 20:49:42 Using profiles dir at /home/user/path_to_proj_dir/proj 20:49:42 Using profiles.yml file at /home/user/path_to_proj_dir/proj/profiles.yml 20:49:42 Using dbt_project.yml file at /home/user/path_to_proj_dir/proj/dbt_project.yml 20:49:42 adapter type: postgres 20:49:42 adapter version: 1.8.2 20:49:42 Skipping steps before connection verification 20:49:42 Connection: 20:49:42 host: postgres_hosting_service 20:49:42 port: 5432 20:49:42 user: user 20:49:42 database: proj 20:49:42 schema: dev 20:49:42 connect_timeout: 300 20:49:42 role: None 20:49:42 search_path: None 20:49:42 keepalives_idle: 5 20:49:42 sslmode: require 20:49:42 sslcert: None 20:49:42 sslkey: None 20:49:42 sslrootcert: None 20:49:42 application_name: dbt 20:49:42 retries: 3 20:49:42 Registered adapter: postgres=1.8.2 20:49:43 Connection test: [OK connection ok] 20:49:43 All checks passed!
profiles.yml配置
proj: outputs: dev: type: postgres threads: 1 host: "{{ env_var('PSQLHOST') }}" port: "{{ env_var('PSQLPORT') | int }}" user: "{{ env_var('PSQLUSER') }}" pass: "{{ env_var('PSQLPASSWORD') }}" dbname: "{{ env_var('PSQLDBNAME') }}" schema: dev connect_timeout: 300 keepalives_idle: 5 retries: 3 sslmode: require prod: type: postgres threads: 1 host: "{{ env_var('PSQLHOST') }}" port: "{{ env_var('PSQLPORT') | int }}" user: "{{ env_var('PSQLUSER') }}" pass: "{{ env_var('PSQLPASSWORD') }}" dbname: "{{ env_var('PSQLDBNAME') }}" schema: prod target: dev
系统环境变量输出
$ echo $PSQLHOST 127.0.0.1
内容的提问来源于stack exchange,提问作者GoneAsync
相关产品推荐
相关产品推荐

