
在 dbt-DuckDB 中使用 Pandas 时出现 No module named 'pandas' 错误,根本原因在于 dbt 未识别到已安装的 Pandas 包;解决方案是将虚拟环境命名为 dbt-env,dbt 会自动激活该环境并加载其中的依赖。
在 dbt-duckdb 中使用 pandas 时出现 `no module named 'pandas'` 错误,根本原因在于 dbt 未识别到已安装的 pandas 包;解决方案是将虚拟环境命名为 `dbt-env`,dbt 会自动激活该环境并加载其中的依赖。
dbt-DuckDB 的 Python 模型(即 model.py 文件)运行时,并不直接复用当前 shell 激活的虚拟环境,也不会自动读取 pip install 到任意 venv 中的包。相反,它遵循一个明确的约定:仅识别并自动加载名为 dbt-env 的虚拟环境(位于项目根目录或用户主目录下)。若该环境存在且已安装 pandas,dbt 将自动将其纳入 Python 模型执行上下文。
✅ 正确配置步骤如下:
-
创建并命名虚拟环境为
dbt-env(推荐置于项目根目录):
提示词大师-python版下载图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
python -m venv dbt-env source dbt-env/bin/activate # Linux/macOS # 或 dbt-env\Scripts\activate.bat # Windows pip install pandas==2.2.3 boto3
-
删除
packages声明中的冗余配置:dbt.config(packages=[...])和models.yml中的packages字段对 Python 模型无效——它们仅适用于 dbt Core 的原生 SQL 模型(配合dbt-python插件),而 dbt-DuckDB 的 Python 模型完全依赖外部 venv,不支持运行时动态安装包。因此,请移除以下两处配置,避免误导:立即学习“Python免费学习笔记(深入)”;
# ❌ 删除这一行(无作用) packages = ["pandas==2.2.3"],
# ❌ models.yml 中也无需声明 packages # config: # packages: ["pandas==2.2.3"]
-
保持简洁、健壮的模型代码:
import boto3 import pandas as pd
def model(dbt, session): dbt.config(materialized="table")
# 示例:从 S3 读取 CSV,清洗后返回 DataFrame
s3_client = boto3.client("s3")
obj = s3_client.get_object(Bucket="my_bucket", Key="my_key")
df = pd.read_csv(obj["Body"])
# 执行必要清洗(如修复列名、类型转换、空值处理等)
df.columns = df.columns.str.strip().str.replace(" ", "_")
df["created_at"] = pd.to_datetime(df["created_at"], errors="coerce")
return df # dbt 自动将 DataFrame 写入 DuckDB 表⚠️ 注意事项: - `python_version` 参数在 dbt-DuckDB 中**不生效**,实际 Python 版本由 `dbt-env` 环境决定(建议与项目兼容,如 `3.11`); - 若使用 CI/CD 或 Docker,需确保构建流程中显式创建并配置 `dbt-env`; - 不要依赖 `session` 参数访问 DuckDB 连接——dbt 已封装 I/O,直接返回 `pd.DataFrame` 即可; - 首次运行前,可通过 `dbt debug` 验证环境是否识别:输出中应包含 `Python version: 3.x (via dbt-env)` 类似提示。 总结:dbt-DuckDB 的 Python 模型依赖约定优于配置。命名虚拟环境为 `dbt-env` 是解锁 Pandas、boto3 等任意 Python 包的关键钥匙——无需修改 YAML、无需动态安装、不依赖 `packages` 字段。结构清晰、可复现、符合 dbt 生态最佳实践。

















