You need to enable JavaScript to run this app. 使用Flask创建数据库时报错:未设置SQLALCHEMY_DATABASE_URI或SQLALCHEMY_BINDS
优惠活动
大模型
产品
解决方案
定价
更多

使用Flask创建数据库时报错:未设置SQLALCHEMY_DATABASE_URI或SQLALCHEMY_BINDS

解决方法

问题根源

初始化Flask-SQLAlchemy的执行顺序错误。你代码里先执行db = SQLAlchemy(app)将数据库实例和Flask应用绑定,之后才写入SQLALCHEMY_DATABASE_URI的配置。
Flask-SQLAlchemy在绑定app的瞬间,会立刻读取当前应用配置查找数据库连接地址,此时配置项还未写入,自然无法识别你设置的本地SQLite路径,只能自动回退到默认的内存SQLite连接,触发对应的警告。这种状态下所有数据会存储在内存中,程序重启后数据会全部丢失。

需要调整的内容

  • 调整代码执行顺序:先完成所有应用配置项的写入,再将app传入SQLAlchemy完成实例初始化
  • 补全缺失的模块导入:你在模型中用到了datetime.utcnow,但代码中没有导入datetime模块,运行时会直接触发名称错误
  • 补充关闭冗余配置:将SQLALCHEMY_TRACK_MODIFICATIONS设为False,避免Flask-SQLAlchemy弹出不必要的变更追踪警告
  • 创建数据库表时需要显式进入应用上下文,否则调用db.create_all()会触发上下文错误

修正后可正常运行的代码

from datetime import datetime
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# 先写入所有应用配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///friends.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 配置完成后再初始化数据库实例
db = SQLAlchemy(app)

class Friends(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(200), nullable=False)
    date_created = db.Column(db.DateTime, default = datetime.utcnow)

    def __repr__(self):
        return '<Name %r>' % self.id

# 初始化数据库表结构时,需要在应用上下文中执行
with app.app_context():
    db.create_all()

内容的提问来源于stack exchange,提问作者Karl Nakouzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 16:06:05