Flask中解决'SQLAlchemy'对象无'query'属性的报错问题
解决AttributeError: 'SQLAlchemy' object has no attribute 'query'问题
方法一:改用Flask-SQLAlchemy(推荐)
你当前使用的sqla_wrapper并非Flask生态标准的SQLAlchemy集成库,API与常用的Flask-SQLAlchemy差异较大,改用后者能避免这类适配问题:
- 安装依赖
pip install flask-sqlalchemy
- 修改
models.py
替换sqla_wrapper的导入,调整DB初始化逻辑:
import os from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin db = SQLAlchemy() class User(UserMixin, db.Model): __tablename__ = 'accounts' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(100), unique=True) password = db.Column(db.String(100)) name = db.Column(db.String(1000))
- 在主Flask应用文件(如
app.py)中初始化DB
from flask import Flask from models import db from auth import auth app = Flask(__name__) # 配置数据库连接地址 app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv("DATABASE_URL", "sqlite:///db.sqlite") app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关联DB与Flask应用 db.init_app(app) # 注册认证蓝图 app.register_blueprint(auth) # 启动前自动创建数据库表 with app.app_context(): db.create_all() if __name__ == '__main__': app.run()
- 修正
auth.py中的数据库操作
- 查询语句替换为
User.query.filter_by(email=email).first()(Flask-SQLAlchemy支持直接通过模型类调用query) - 添加用户和提交操作改为
db.session.add(new_user)和db.session.commit()
修改后的关键代码示例:
# login_post中的查询逻辑 user = User.query.filter_by(email=email).first() # signup_post中的用户添加逻辑 new_user = User(email=email, name=name, password=generate_password_hash(password, method='sha256')) db.session.add(new_user) db.session.commit()
方法二:继续使用sqla_wrapper,修正API调用
若不想更换依赖库,只需将查询语句中的db.query(User)替换为db.session.query(User)——sqla_wrapper的查询接口挂载在session对象上:
修改auth.py中两处查询代码:
# login_post里的查询 user = db.session.query(User).filter_by(email=email).first() # signup_post里的查询 user = db.session.query(User).filter_by(email=email).first()
其余的db.add(new_user)和db.commit()可保留,sqla_wrapper支持这些快捷方法。
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

