flask-SQLAlchemy create_all()创建表失败报错

本文解决了一个在使用Flask-SQLAlchemy时遇到的常见问题:create_all()创建表失败,报错‘No application found’。通过正确设置应用上下文,成功解决了这一问题。

create_all()创建表失败报错:‘No application found. Either work inside a view function or push an application context.’

今天在用flask-SQLAlchemy时遇到的问题,总体而言我的问题和这位老兄一模一样:https://stackoverflow.com/questions/46540664/no-application-found-either-work-inside-a-view-function-or-push-an-application

解决方案

上下文设置问题,链接中大佬给出了解决方案:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'My connection string'

with app.app_context():
    db.init_app(app)

我是db.create_all()时遇到的报错,也是一样加入到上下文中去

with app.app_context():
    db.init_app(app)
    db.create_all()

解决了,又走过了一个弯路,成就+1

(venv) gapinyc@DESKTOP-9QS7RL5:~/superset$ pip install --upgrade pymysql sqlalchemy flask-sqlalchemy Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/ Requirement already satisfied: pymysql in ./venv/lib/python3.10/site-packages (1.1.2) Requirement already satisfied: sqlalchemy in ./venv/lib/python3.10/site-packages (1.4.54) Collecting sqlalchemy Downloading https://pypi.tuna.tsinghua.edu.cn/packages/4a/d8/c63d8adb6a7edaf8dcb6f75a2b1e9f8577960a1e489606859c4d73e7d32b/sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 11.5 MB/s 0:00:00 Requirement already satisfied: flask-sqlalchemy in ./venv/lib/python3.10/site-packages (2.5.1) Collecting flask-sqlalchemy Downloading https://pypi.tuna.tsinghua.edu.cn/packages/1d/6a/89963a5c6ecf166e8be29e0d1bf6806051ee8fe6c82e232842e3aeac9204/flask_sqlalchemy-3.1.1-py3-none-any.whl (25 kB) Requirement already satisfied: greenlet>=1 in ./venv/lib/python3.10/site-packages (from sqlalchemy) (3.1.1) Requirement already satisfied: typing-extensions>=4.6.0 in ./venv/lib/python3.10/site-packages (from sqlalchemy) (4.15.0) Requirement already satisfied: flask>=2.2.5 in ./venv/lib/python3.10/site-packages (from flask-sqlalchemy) (2.3.3) Requirement already satisfied: Werkzeug>=2.3.7 in ./venv/lib/python3.10/site-packages (from flask>=2.2.5->flask-sqlalchemy) (3.1.3) Requirement already satisfied: Jinja2>=3.1.2 in ./venv/lib/python3.10/site-packages (from flask>=2.2.5->flask-sqlalchemy) (3.1.6) Requirement already satisfied: itsdangerous>=2.1.2 in ./venv/lib/python3.10/site-packages (from flask>=2.2.5->flask-sqlalchemy) (2.2.0) Requirement already satisfied: click>=8.1.3 in ./venv/lib/python3.10/site-packages (from flask>=2.2.5->flask-sqlalchemy) (8.3.0) Requirement already satisfied: blinker>=1.6.2 in ./venv/lib/python3.10/site-packages (from flask>=2.2.5->flask-sqlalchemy) (1.9.0) Requirement already satisfied: MarkupSafe>=2.0 in ./venv/lib/python3.10/site-packages (from Jinja2>=3.1.2->flask>=2.2.5->flask-sqlalchemy) (3.0.3) Installing collected packages: sqlalchemy, flask-sqlalchemy Attempting uninstall: sqlalchemy Found existing installation: SQLAlchemy 1.4.54 Uninstalling SQLAlchemy-1.4.54: Successfully uninstalled SQLAlchemy-1.4.54 Attempting uninstall: flask-sqlalchemy Found existing installation: Flask-SQLAlchemy 2.5.1 Uninstalling Flask-SQLAlchemy-2.5.1: Successfully uninstalled Flask-SQLAlchemy-2.5.1 ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. flask-appbuilder 4.8.1 requires Flask-SQLAlchemy<3,>=2.4, but you have flask-sqlalchemy 3.1.1 which is incompatible. flask-appbuilder 4.8.1 requires SQLAlchemy<1.5, but you have sqlalchemy 2.0.44 which is incompatible. apache-superset 5.0.0 requires sqlalchemy<2,>=1.4, but you have sqlalchemy 2.0.44 which is incompatible. Successfully installed flask-sqlalchemy-3.1.1 sqlalchemy-2.0.44 (venv) gapinyc@DESKTOP-9QS7RL5:~/superset$
最新发布
10-26
你执行了: ```bash pip install --upgrade pymysql sqlalchemy flask-sqlalchemy ``` 结果 **升级到了 SQLAlchemy 2.0.44 和 Flask-SQLAlchemy 3.1.1**,但出现了关键的兼容性错误: ``` ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. flask-appbuilder 4.8.1 requires Flask-SQLAlchemy<3,>=2.4, but you have flask-sqlalchemy 3.1.1 which is incompatible. flask-appbuilder 4.8.1 requires SQLAlchemy<1.5, but you have sqlalchemy 2.0.44 which is incompatible. apache-superset 5.0.0 requires sqlalchemy<2,>=1.4, but you have sqlalchemy 2.0.44 which is incompatible. ``` --- ## ⚠️ 问题严重性 你已经破坏了 Superset 的依赖环境! ### ❌ 当前状态: - `SQLAlchemy=2.0.44` → 不被 FAB 和 Superset 支持 - `Flask-SQLAlchemy=3.1.1` → 要求 SQLAlchemy ≥2.0,但 Superset 只支持 <2 - **后果:Superset 将无法正常运行,API 报错、数据库连接失败、ORM 映射崩溃** > ✅ **结论:必须回滚到兼容版本!** --- ## ✅ 正确解决方案:降级 SQLAlchemyFlask-SQLAlchemy Apache Superset **5.0.0** 和 Flask AppBuilder **4.8.1** 对 SQLAlchemy 有严格限制: | 包 | 兼容版本范围 | |----|-------------| | `SQLAlchemy` | `<2.0`, `>=1.4` → 推荐 `1.4.54` | | `Flask-SQLAlchemy` | `<3.0`, `>=2.4` → 推荐 `2.5.1` | ### 🔧 修复命令(立即执行) ```bash pip install "SQLAlchemy==1.4.54" "Flask-SQLAlchemy==2.5.1" ``` 📌 输出应类似: ``` Installing collected packages: SQLAlchemy, Flask-SQLAlchemy Attempting uninstall: SQLAlchemy Removing file: /home/gapinyc/superset/venv/lib/python3.10/site-packages/SQLAlchemy-2.0.44.dist-info Successfully uninstalled SQLAlchemy-2.0.44 Attempting uninstall: Flask-SQLAlchemy Removing file: /home/gapinyc/superset/venv/lib/python3.10/site-packages/Flask_Sqlalchemy-3.1.1.dist-info Successfully uninstalled Flask-SQLAlchemy-3.1.1 Successfully installed SQLAlchemy-1.4.54 Flask-SQLAlchemy-2.5.1 ``` ✅ 验证是否安装成功: ```bash python -c "import sqlalchemy; print(sqlalchemy.__version__)" # 输出:1.4.54 python -c "import flask_sqlalchemy; print(flask_sqlalchemy.__version__)" # 输出:2.5.1 ``` --- ## 🛠️ 补充配置建议 ### 1. 在 `superset_config.py` 中启用连接池健康检查 虽然不能用 `pool_pre_ping=True`(它在 SQLAlchemy 1.4 中可用),但你应该加上: ```python # superset_config.py import os SECRET_KEY = '1sCjCsfAPMBskPWPSJ0Gja7JvpufVc50vTW04MSiJuzNN3JPlUYL3MR+' # 示例 MySQL 连接(替换为你的) SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@localhost/superset_db?charset=utf8mb4' # 关键:防止 “Command Out of Sync” 和 “Lost connection” SQLALCHEMY_ENGINE_OPTIONS = { "pool_pre_ping": True, # ✅ 在 SQLAlchemy 1.4 中已支持 "pool_recycle": 3600, # 每小时重建连接,避免 MySQL 超时断开 "pool_timeout": 30, "max_overflow": 10, "connect_args": {"connect_timeout": 10}, } ``` > ✅ `pool_pre_ping=True` 是解决 `OperationalError (2013/2014)` 的最有效方式,即使在 SQLAlchemy 1.4 中也完全支持。 --- ### 2. 确保其他依赖版本正确 推荐锁定以下版本(适用于 Superset 5.0): ```txt # requirements.txt apache-superset==5.0.0 PyMySQL==1.1.2 SQLAlchemy==1.4.54 Flask-SQLAlchemy==2.5.1 flask-appbuilder==4.8.1 ``` 安装命令: ```bash pip install -r requirements.txt ``` --- ## ✅ 后续操作流程 ### Step 1:确认数据库 URI 正确 确保你在 `superset_config.py` 或 `.env` 中设置了正确的元数据库地址: ```python SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://superset:your_password@localhost/superset?charset=utf8mb4' ``` > 💡 建议不要使用 SQLite,生产环境推荐 MySQL 或 PostgreSQL。 --- ### Step 2:运行数据库迁移 ```bash superset db upgrade ``` 这会创建或更新所有必要的(包括 `ab_role`, `ab_permission_view` 等)。 --- ### Step 3:初始化权限系统 ```bash superset init ``` 输出示例: ``` Recognized Database Authentications. Creating default roles and permissions Admin user admin created Inserting roles as bulk insert is more efficient Creating default roles ... Done ``` --- ### Step 4:重启 Gunicorn ```bash gunicorn \ --bind 0.0.0.0:8088 \ --workers 4 \ --worker-class gthread \ --threads 4 \ --timeout 120 \ --max-requests 1000 \ --max-requests-jitter 100 \ --preload \ --access-logfile - \ --error-logfile - \ "superset.app:create_app()" ``` 刷新页面后,之前的 500 错误应该消失。 --- ## 🧰 如何避免未来出现此类问题? ### ✅ 方法 1:使用虚拟环境 + 固定版本 ```bash python -m venv venv source venv/bin/activate pip install apache-superset==5.0.0 pip freeze > requirements.txt # 锁定当前工作版本 ``` 以后部署都用: ```bash pip install -r requirements.txt ``` ### ✅ 方法 2:不要随意升级包 除非明确知道新版本兼容,否则不要执行: ```bash pip install --upgrade xxx ``` 特别是 `SQLAlchemy`, `Flask`, `Werkzeug` 这类核心库。 --- ## 🔍 总结 | 问题 | 解决方案 | |------|----------| | `NoSuchColumnError` / `Command Out of Sync` | 降级 SQLAlchemy 到 1.4.x 并启用 `pool_pre_ping` | | `flask-appbuilder` 依赖冲突 | 安装 `Flask-SQLAlchemy==2.5.1` | | 权限系统异常 | 执行 `superset db upgrade && superset init` | | 数据库连接中断 | 使用 `pool_pre_ping=True` + `pool_recycle=3600` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值