You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:54:26