WSL Ubuntu环境执行airflow db init报wtforms无TextField属性错误
问题场景
参照操作流程在Windows 10的WSL子系统Ubuntu环境中部署Airflow,执行airflow db init命令初始化数据库时触发报错。
核心报错信息:
AttributeError: module 'wtforms.fields' has no attribute 'TextField'
完整错误追踪栈:
(airflow_env) sultani@Khalid:~/c/users/administrator/airflowhome$ airflow db init DB: sqlite:///c/users/administrator/airflowhome/airflow.db [2022-06-09 00:41:54,760] {db.py:1448} INFO - Creating tables INFO [alembic.runtime.migration] Context impl SQLiteImpl. INFO [alembic.runtime.migration] Will assume non-transactional DDL. Traceback (most recent call last): File "/home/sultani/.local/bin/airflow", line 8, in <module> sys.exit(main()) File "/home/sultani/.local/lib/python3.8/site-packages/airflow/__main__.py", line 38, in main args.func(args) File "/home/sultani/.local/lib/python3.8/site-packages/airflow/cli/cli_parser.py", line 51, in command return func(*args, **kwargs) File "/home/sultani/.local/lib/python3.8/site-packages/airflow/cli/commands/db_command.py", line 35, in initdb db.initdb() File "/home/sultani/.local/lib/python3.8/site-packages/airflow/utils/session.py", line 71, in wrapper return func(*args, session=session, **kwargs) File "/home/sultani/.local/lib/python3.8/site-packages/airflow/utils/db.py", line 648, in initdb upgradedb(session=session) File "/home/sultani/.local/lib/python3.8/site-packages/airflow/utils/session.py", line 68, in wrapper return func(*args, **kwargs) File "/home/sultani/.local/lib/python3.8/site-packages/airflow/utils/db.py", line 1449, in upgradedb command.upgrade(config, revision=to_revision or 'heads') File "/home/sultani/.local/lib/python3.8/site-packages/alembic/command.py", line 322, in upgrade script.run_env() File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/base.py", line 569, in run_env util.load_python_file(self.dir, "env.py") File "/home/sultani/.local/lib/python3.8/site-packages/alembic/util/pyfiles.py", line 94, in load_python_file module = load_module_py(module_id, path) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/util/pyfiles.py", line 110, in load_module_py spec.loader.exec_module(module) # type: ignore File "<frozen importlib._bootstrap_external>", line 848, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/sultani/.local/lib/python3.8/site-packages/airflow/migrations/env.py", line 107, in <module> run_migrations_online() File "/home/sultani/.local/lib/python3.8/site-packages/airflow/migrations/env.py", line 101, in run_migrations_online context.run_migrations() File "<string>", line 8, in run_migrations File "/home/sultani/.local/lib/python3.8/site-packages/alembic/runtime/environment.py", line 853, in run_migrations self.get_context().run_migrations(**kw) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/runtime/migration.py", line 611, in run_migrations for step in self._migrations_fn(heads, self): File "/home/sultani/.local/lib/python3.8/site-packages/alembic/command.py", line 311, in upgrade return script._upgrade_revs(revision, rev) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/base.py", line 443, in _upgrade_revs for script in reversed(list(revs)) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/revision.py", line 799, in iterate_revisions revisions, heads = fn( File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/revision.py", line 1426, in _collect_upgrade_revisions for rev in self._parse_upgrade_target( File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/revision.py", line 1218, in _parse_upgrade_target return self.get_revisions(target) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/revision.py", line 529, in get_revisions resolved_id, branch_label = self._resolve_revision_number( File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/revision.py", line 753, in _resolve_revision_number self._revision_map File "/home/sultani/.local/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 1095, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/revision.py", line 191, in _revision_map for revision in self._generator(): File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/base.py", line 140, in _load_revisions script = Script._from_filename(self, vers, file_) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/script/base.py", line 1013, in _from_filename module = util.load_python_file(dir_, filename) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/util/pyfiles.py", line 94, in load_python_file module = load_module_py(module_id, path) File "/home/sultani/.local/lib/python3.8/site-packages/alembic/util/pyfiles.py", line 110, in load_module_py spec.loader.exec_module(module) # type: ignore File "<frozen importlib._bootstrap_external>", line 848, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/sultani/.local/lib/python3.8/site-packages/airflow/migrations/versions/0073_2_0_0_prefix_dag_permissions.py", line 27, in <module> from flask_appbuilder import SQLA File "/home/sultani/.local/lib/python3.8/site-packages/flask_appbuilder/__init__.py", line 6, in <module> from .base import AppBuilder # noqa: F401 File "/home/sultani/.local/lib/python3.8/site-packages/flask_appbuilder/base.py", line 8, in <module> from .api.manager import OpenApiManager File "/home/sultani/.local/lib/python3.8/site-packages/flask_appbuilder/api/manager.py", line 8, in <module> from flask_appbuilder.baseviews import BaseView File "/home/sultani/.local/lib/python3.8/site-packages/flask_appbuilder/baseviews.py", line 21, in <module> from .forms import GeneralModelConverter File "/home/sultani/.local/lib/python3.8/site-packages/flask_appbuilder/forms.py", line 25, in <module> from .models.mongoengine.fields import MongoFileField, MongoImageField File "/home/sultani/.local/lib/python3.8/site-packages/flask_appbuilder/models/mongoengine/fields.py", line 4, in <module> from ...upload import BS3FileUploadFieldWidget, BS3ImageUploadFieldWidget File "/home/sultani/.local/lib/python3.8/site-packages/flask_appbuilder/upload.py", line 106, in <module> class FileUploadField(fields.TextField): AttributeError: module 'wtforms.fields' has no attribute 'TextField'
报错原因
这是典型的依赖版本不兼容问题:WTForms 3.0及以上版本删除了废弃的TextField字段,统一改用StringField,但当前环境安装的Flask-AppBuilder版本未做对应适配,pip安装依赖时默认拉取了最新版WTForms,最终触发属性不存在的错误。
解决方法
- 优先选择降级WTForms到兼容版本,在激活的Airflow虚拟环境中执行命令:
pip install wtforms==2.3.3
安装完成后重新执行airflow db init即可正常完成数据库初始化。 - 如果不想降级WTForms,可以升级Flask-AppBuilder到已适配WTForms 3.x的最新版本,执行命令:
pip install --upgrade flask-appbuilder
升级完成后重新运行初始化命令即可。
内容的提问来源于stack exchange,提问作者user3060119
相关产品推荐
相关产品推荐

