Python Flask从MySQL数据库获取数据的实现及报错解决
问题定位
你的代码存在以下几个直接导致报错的问题:
- 依赖混用:导入了
flask_mysqldb的MySQL类,但连接逻辑用的是mysql.connector的语法,且没有导入mysql.connector模块,会触发name 'mysql' is not defined错误 - 基础对象缺失:没有初始化Flask应用实例,也没有导入模板渲染需要的
render_template方法 - 方法名拼写错误:创建游标时写的
mydb.mycursor()是错误写法,正确方法名是mydb.cursor() - 连接参数不全:本地MySQL连接必须传入root账号对应的密码参数,空密码传空字符串即可,缺省参数会直接连库失败
- 资源泄漏风险:查询完成后没有关闭数据库连接,长期运行会占满连接池
- 逻辑冗余:把数据库查询逻辑嵌套在路由函数内部没有必要,徒增代码复杂度
- 模板渲染逻辑错误:直接把查询返回的结果集塞进h1标签,无法正常按行展示表数据
修复方案
1. 安装对应依赖
不要混用两套MySQL驱动,选其一即可,这里以你代码里用到的mysql-connector-python为例,先安装对应依赖:
pip install flask mysql-connector-python
2. 修正Flask应用代码
from flask import Flask, render_template import mysql.connector # 初始化Flask实例 app = Flask(__name__) # 数据库连接配置,替换为你自己的实际参数 DB_CONFIG = { "host": "localhost", "user": "root", "password": "你的MySQL root账号密码", "database": "books" } @app.route('/books') def book_list(): db_conn = None cursor = None book_list = [] try: # 建立数据库连接 db_conn = mysql.connector.connect(**DB_CONFIG) # 创建游标,dictionary=True返回字典格式结果,模板中可以直接通过字段名取值 cursor = db_conn.cursor(dictionary=True) # 执行查询语句,已经指定连接的数据库为books,不需要加库名前缀 cursor.execute("SELECT * FROM books_tb") # 获取所有查询结果 book_list = cursor.fetchall() except Exception as e: book_list = [{"err_msg": f"查询失败:{str(e)}"}] finally: # 资源释放:先关游标,再关数据库连接 if cursor: cursor.close() if db_conn: db_conn.close() return render_template("index.html", ScrapedBookData=book_list) if __name__ == "__main__": # 开发阶段开debug模式,报错会直接展示具体错误行,方便排查 app.run(debug=True)
3. 修正模板渲染逻辑
查询返回的fetchall()结果是多行数据组成的列表,需要用Jinja2的循环标签遍历输出,不要直接把整个列表塞进标题标签:
{% extends "base.html"%} {% block title %}图书列表{% endblock %} {% block content %} <h1>馆藏图书</h1> <div class="book-list"> {% for book in ScrapedBookData %} <div class="book-item"> <!-- 下方字段名替换成你自己books_tb表的实际字段即可 --> <p>图书ID:{{ book.id }}</p> <p>书名:{{ book.title }}</p> <p>作者:{{ book.author }}</p> <p>价格:{{ book.price }}</p> </div> {% endfor %} </div> {% endblock %}
排查注意事项
- 运行代码前先确认MySQL服务处于启动状态,通过MySQL Workbench能正常用root账号登录、访问books库下的books_tb表,确认账号密码和代码中配置的一致
- 模板中写的字段名必须和
books_tb表的实际字段名完全一致,否则会触发字段不存在的错误 - 如果要改用
flask_mysqldb驱动,不要保留mysql.connector的连接逻辑,按照flask_mysqldb的官方文档初始化MySQL实例后再操作
内容的提问来源于stack exchange,提问作者Hamsi Tava
相关产品推荐
相关产品推荐

