Apache Airflow 2.6.1与SQLAlchemy 2.0.2版本冲突问题求助
问题分析与解决方法
问题本质
你的核心矛盾是依赖版本冲突:
- Apache Airflow 2.6.1通过官方约束文件强制要求SQLAlchemy 1.4.48,它内部的数据库连接代码仍在使用SQLAlchemy 1.x的
encoding参数; - 你的业务模块依赖SQLAlchemy 2.0.2的新特性,无法降级到1.4.48;
- 升级SQLAlchemy到2.0后,Airflow调用
create_engine()时传入的encoding参数已被SQLAlchemy 2.0移除,因此抛出TypeError。
解决方案
方案1:升级Airflow到支持SQLAlchemy 2.0的版本(推荐)
Airflow 2.7.0及以上版本已正式支持SQLAlchemy 2.0,直接升级Airflow即可彻底解决版本冲突:
- 卸载现有Airflow:
pip uninstall apache-airflow -y - 安装Airflow 2.7.0+版本(以2.7.0为例),使用对应版本的约束文件:
pip install "apache-airflow[postgres]==2.7.0" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.0/constraints-3.9.txt" - 安装SQLAlchemy 2.0.2:
pip install sqlalchemy==2.0.2
此方案无需修改代码,是最稳妥的解决方式。
方案2:隔离依赖环境(无法升级Airflow时使用)
如果因业务限制无法升级Airflow,可将Airflow与你的数据库模块放在独立的虚拟环境/容器中,通过跨进程通信(如API、消息队列)交互:
- 为Airflow单独创建虚拟环境,安装2.6.1版本和SQLAlchemy 1.4.48;
- 为你的数据库模块创建另一个虚拟环境,安装SQLAlchemy 2.0.2;
- 两者通过HTTP接口、Redis/RabbitMQ等方式传递数据,避免直接共享依赖。
方案3:临时修改Airflow源码(应急用,不推荐)
如果必须在同一环境运行,可临时修改Airflow中传递encoding参数的代码:
- 找到Airflow中调用
create_engine并传入encoding的文件(通常在airflow/utils/db.py或相关数据库连接模块); - 将
encoding参数移除,或替换为SQLAlchemy 2.0支持的方式:- 原代码示例:
engine = create_engine(url, encoding='utf-8', ...) - 修改后:
# 方式1:移除encoding参数,SQLAlchemy 2.0默认使用utf-8 engine = create_engine(url, ...) # 方式2:通过connect_args传递(如果需要指定编码) engine = create_engine(url, connect_args={"encoding": "utf-8"}, ...)
- 原代码示例:
注意:此方法会破坏Airflow的官方一致性,后续升级Airflow时需要重新修改,且可能存在其他未发现的兼容性问题,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者Rett_oo
相关产品推荐
相关产品推荐

