You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:09:29