使用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
相关产品推荐
相关产品推荐

