SQLAlchemy对象无connection属性报错 如何正确连接MySQL数据库
报错原因
你使用的是Flask-SQLAlchemy封装后的SQLAlchemy实例对象,该对象没有直接暴露connection属性,你直接套用了原生PyMySQL的游标操作逻辑,因此触发属性不存在的报错。
解决方案
方案1:保留原生SQL执行逻辑的修改方法
如果需要继续用原生SQL做查询,可通过db.engine或者db.session获取连接执行,修改后代码如下:
if request.method == 'POST' and 'username' in request.form and 'password' in request.form: # Create variables for easy access username = request.form['username'] password = request.form['password'] # Check if account exists using MySQL # 方式1:通过engine获取连接执行,返回字典格式结果 with db.engine.connect() as conn: result = conn.execute( 'SELECT * FROM accounts WHERE username = %s AND password = %s', (username, password) ) # mappings()方法可将返回结果转为字典格式,等价于原代码的DictCursor效果 account = result.mappings().fetchone() # 方式2:更简洁的session执行写法,参数用命名占位符更安全 # account = db.session.execute( # 'SELECT * FROM accounts WHERE username = :username AND password = :password', # {"username": username, "password": password} # ).mappings().fetchone()
注意:当前代码明文存储、比对用户密码属于高危安全漏洞,生产环境必须使用bcrypt等加密方案对密码做哈希存储后再做比对
方案2:推荐的ORM查询写法(符合SQLAlchemy使用规范)
首先提前定义Account映射模型:
class Account(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(50), unique=True, nullable=False) password = db.Column(db.String(255), nullable=False) # 其余业务字段按需补充
查询代码可简化为:
account = Account.query.filter_by(username=username, password=password).first()
Flask场景下SQLAlchemy连接MySQL的正确前置配置
- 安装依赖:
pip install flask-sqlalchemy pymysql - 初始化配置代码示例:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 连接URI格式:mysql+pymysql://数据库用户名:密码@主机地址:端口/库名?charset=utf8mb4 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:your_db_password@127.0.0.1:3306/your_db_name' # 关闭不必要的对象修改追踪,减少性能开销 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)
内容的提问来源于stack exchange,提问作者Samiksha Mobarkar
相关产品推荐
相关产品推荐

