Flask SQLAlchemy报错:TypeError: 'Flask'对象不可迭代 求助
Flask应用创建数据库时报TypeError: 'Flask' object is not iterable错误的解决办法
问题背景
跟着YouTube教程开发带用户注册/登录和个人页面的Flask应用,遇到错误卡壳,无法继续。
错误信息
Traceback (most recent call last): File "C:\Users\mmacp\PycharmProjects\cfg_project\main.py", line 11, in <module> app = create_app() File "C:\Users\mmacp\PycharmProjects\cfg_project\website\__init__.py", line 25, in create_app create_database(app) File "C:\Users\mmacp\PycharmProjects\cfg_project\website\__init__.py", line 32, in create_database db.create_all(app) File "C:\Users\mmacp\AppData\Local\Programs\Python\Python310\lib\site-packages\flask_sqlalchemy\extension.py", line 868, in create_all self._call_for_binds(bind_key, "create_all") File "C:\Users\mmacp\AppData\Local\Programs\Python\Python310\lib\site-packages\flask_sqlalchemy\extension.py", line 837, in _call_for_binds for key in keys: TypeError: 'Flask' object is not iterable
相关代码
main.py
from website import create_app app = create_app() if __name__ == '__main__': app.run(debug=True)
init.py
from flask import Flask from flask_sqlalchemy import SQLAlchemy from os import path db = SQLAlchemy() DB_NAME = "database.db" def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'kdxhfds iefhsdbf' app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}' db.init_app(app) from .views import views from .auth import auth app.register_blueprint(views, url_prefix='/') app.register_blueprint(auth, url_prefix='/') from .models import User, Posts create_database(app) return app def create_database(app): if not path.exists('website/' + DB_NAME): db.create_all(app) print('Created Database!')
models.py
from website import db from flask_login import UserMixin from sqlalchemy.sql import func class Posts(db.Model): id = db.Column(db.Integer, primary_key=True) data = db.Column(db.String(500)) date = db.Column(db.DateTime(timezone=True), default=func.now) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # refs the User table class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(150), unique=True) username = db.Column(db.String(150), unique=True) password = db.Column(db.String(150)) first_name = db.Column(db.String(150)) surname = db.Column(db.String(150)) fav_team = db.Column(db.String(150)) notes = db.relationship('posts')
解决方法
核心错误原因
你使用的是Flask-SQLAlchemy 3.x版本,而教程大概率基于旧版(2.x及以下)。新版本中db.create_all()不再接受app作为参数,必须通过应用上下文执行数据库操作。
具体修复步骤
- 修改
__init__.py中的create_database函数:
将db.create_all(app)替换为在应用上下文内调用db.create_all():def create_database(app): if not path.exists('website/' + DB_NAME): with app.app_context(): db.create_all() print('Created Database!') - 修复
models.py中的关联错误:
User类里的notes = db.relationship('posts')要改成notes = db.relationship('Posts')——SQLAlchemy关联时需要对应类的名称(区分大小写),否则会找不到关联表。
修复逻辑说明
Flask-SQLAlchemy 3.x采用了更严格的上下文管理,db.init_app(app)仅完成数据库与应用的绑定,但创建表这类操作必须显式进入应用上下文,让SQLAlchemy明确当前使用的Flask应用实例。
内容的提问来源于stack exchange,提问作者techie_
相关产品推荐
相关产品推荐

