用 Python + Flask 写一个 MySQL 查询接口,返回 JSON 数据(附 TaoToken 统一 Key 配置)

发布时间:2026/10/12 10:16:17

用 Python + Flask 写一个 MySQL 查询接口,返回 JSON 数据(附 TaoToken 统一 Key 配置) 1. 从脚本到接口Flask MySQL 查询返回 JSON 到底解决什么问题很多人第一次写 Python 查 MySQL都是像下面这样连上数据库、执行一条select * from user、把结果print出来脚本一跑控制台刷出一堆元组任务就算完成了。这种写法自己看数据没问题但一旦别人前端、另一个服务、AI 工具想拿这份数据就抓瞎了——总不能让人家连你的数据库账号密码吧。所以要把「查数据」这件事包装成一个 HTTP 接口别人发一个请求你返回一段 JSON数据格式统一、跨语言通用。Flask 就是干这个最轻量的选择几十行代码就能跑起来MySQL 负责存数据JSON 负责把查询结果序列化成标准格式。这套组合特别适合中小项目、内部工具、数据看板的后端也适合你后面把接口接到 AI 工具链里做数据问答。这篇文章我会带你从零走一遍建表、写 Flask 路由、连接 MySQL、把结果转成 JSON、用 curl 验证最后再把接口调用里的鉴权和 Base URL 统一收敛到 TaoToken这样以后你接别的 AI 工具时Key 和地址不用到处改。适合刚学 Flask 的同学也适合手上有老脚本想改成接口的开发者。核心检索词就是 python、Flask、MySQL、接口、JSON下面每一步都给可复制的代码。先说清楚整体链路客户端curl / Postman / 前端发 HTTP 请求 → Flask 路由接收参数 → 用数据库驱动连 MySQL 执行 SQL → 拿到结果集 → 逐行转成字典 →jsonify或json.dumps返回。中间最容易踩的坑有三个一是数据库连接没关导致连接数爆掉二是datetime类型不能直接 JSON 序列化三是 SQL 拼接导致注入。这三个我都会在对应章节讲透。2. 环境准备与 TaoToken 统一 Key 前置配置在写代码之前先把依赖和「统一入口」这两件事办了。依赖很简单一个requirements.txt搞定Flask3.0.3 PyMySQL1.1.1这里我特意用PyMySQL而不是老教程里的MySQLdb。原因很实际MySQLdb也就是mysqlclient在 Windows 上编译经常报错装起来费劲PyMySQL是纯 Python 实现pip install直接过API 还基本兼容。你原来的脚本里import MySQLdb换成import pymysql后connect()的参数几乎不用改后面我会给对照。装依赖pip install -r requirements.txt接下来是这篇比较特别的部分——把接口调用的鉴权和 Base URL 统一到 TaoToken。你可能会问我一个查 MySQL 的接口跟 AI 工具有啥关系关系在于很多人的项目里不止一个外部服务今天接个模型对话明天接个代码补全后天又来个 Agent每个服务的 Key 和地址都散落在不同文件里改一次要翻半天。TaoToken 提供统一的 API 入口把模型调用、Coding Plan、API Keys 管理这些收敛到一处Base URL 固定为https://taotoken.net/api你只需要维护一个 Key。具体操作先到控制台创建 API Key。打开 https://taotoken.net/console 登录后在 API Keys 页面新建一个 Key复制出来保存好只显示一次。这个 Key 就是你后面所有工具共用的凭证。然后确认你的 Base URL。所有走 TaoToken 的请求地址前缀都是https://taotoken.net/api比如模型对话的调用、Coding Plan 的接入都基于这个 Base URL 拼路径。文档在 https://taotoken.net/doc 里面有各端点的具体路径和参数说明建议收藏。为什么要在写 Flask 接口的阶段就提这个因为一个健康的习惯是外部依赖的地址和密钥永远从环境变量或统一配置读不要硬编码在业务代码里。你的 Flask 接口连 MySQL 的密码不该写死同理你调 AI 服务的 Key 也不该写死。下面我给一个.env风格的配置约定Flask 和 AI 调用共用# .env 示例实际用 os.environ 读取 DB_HOST127.0.0.1 DB_PORT3306 DB_USERroot DB_PASSWORDyour_db_password DB_NAMEzlnewschema TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYsk-你的Key这样你的 Flask 接口负责查数据AI 相关调用负责理解数据两边共享同一套配置加载逻辑迁移环境时只改.env代码一行不动。如果你后面要做长期编码或 Agent 类项目可以了解下 Coding Planhttps://taotoken.net/coding-plan 它把编码场景的额度和管理也整合进来了。3. 可复制配置建表 SQL、Flask 路由与 JSON 序列化这一节是核心代码全部可复制。先建库建表再灌测试数据。CREATE DATABASE IF NOT EXISTS zlnewschema DEFAULT CHARSET utf8mb4; USE zlnewschema; CREATE TABLE IF NOT EXISTS user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64) NOT NULL, email VARCHAR(128) NOT NULL, password VARCHAR(128) NOT NULL, createtime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO user (name, email, password, createtime) VALUES (张亮, zhangliangexample.com, pw_zhang, 2024-05-01 10:20:30), (李雷, lileiexample.com, pw_li, 2024-05-02 11:00:00), (韩梅梅, hanmeimeiexample.com, pw_han, 2024-05-03 09:15:45);注意createtime是DATETIME类型这就是后面报TypeError的根源先埋个伏笔。接着写 Flask 应用。我把它拆成「配置加载 连接管理 路由」三块方便你对照自己的老脚本改。# app.py import os import json from datetime import datetime from flask import Flask, request, jsonify import pymysql app Flask(__name__) DB_CONFIG { host: os.environ.get(DB_HOST, 127.0.0.1), port: int(os.environ.get(DB_PORT, 3306)), user: os.environ.get(DB_USER, root), password: os.environ.get(DB_PASSWORD, your_db_password), database: os.environ.get(DB_NAME, zlnewschema), charset: utf8mb4, cursorclass: pymysql.cursors.DictCursor, } def get_conn(): return pymysql.connect(**DB_CONFIG) def row_to_dict(row): 把一行数据转成可 JSON 序列化的字典 result {} for key, value in row.items(): if isinstance(value, datetime): result[key] value.strftime(%Y-%m-%d %H:%M:%S) else: result[key] value return result app.route(/api/users, methods[GET]) def list_users(): name request.args.get(name) conn get_conn() try: with conn.cursor() as cursor: if name: sql SELECT id, name, email, createtime FROM user WHERE name %s cursor.execute(sql, (name,)) else: sql SELECT id, name, email, createtime FROM user cursor.execute(sql) rows cursor.fetchall() data [row_to_dict(r) for r in rows] return jsonify({code: 0, msg: ok, data: data}) finally: conn.close() if __name__ __main__: app.run(host0.0.0.0, port5590, debugTrue)几个关键改动对照你原来的脚本看第一cursorclasspymysql.cursors.DictCursor。这一行让查询结果直接是字典{name: 张亮, ...}而不是元组。你原来用row[0]、row[1]按位置取值字段顺序一变就全乱用字典游标后按字段名取值稳得多。第二row_to_dict里对datetime做了strftime转换。这就是你之前遇到TypeError: Object of type datetime is not JSON serializable的正解——不是把整行拼成字符串而是逐字段判断类型再转换这样返回的仍是结构化 JSON不是一坨字符串。第三SQL 用%s占位符 参数元组(name,)而不是where name %s % name。后者是字符串拼接用户传个 OR 11就能拖库必须换成参数化查询。第四用jsonify而不是json.dumps。jsonify会自动设置Content-Type: application/json还会处理中文编码比手动dumps再Response省事。如果你确实想保留json.dumps的写法比如要控制indent可以这样from flask import Response return Response( json.dumps({code: 0, data: data}, ensure_asciiFalse, indent2), mimetypeapplication/json )ensure_asciiFalse保证中文不被转成\uXXXXmimetype保证响应头正确。4. 验证请求curl 与 Postman 实测返回 JSON代码写完跑起来验证。先启动服务python app.py看到Running on http://0.0.0.0:5590就说明起来了。然后开另一个终端用 curl 测。查全部curl -s http://127.0.0.1:5590/api/users预期返回{ code: 0, msg: ok, data: [ {id: 1, name: 张亮, email: zhangliangexample.com, createtime: 2024-05-01 10:20:30}, {id: 2, name: 李雷, email: lileiexample.com, createtime: 2024-05-02 11:00:00}, {id: 3, name: 韩梅梅, email: hanmeimeiexample.com, createtime: 2024-05-03 09:15:45} ] }按条件筛选查「张亮」curl -s http://127.0.0.1:5590/api/users?name张亮预期只返回一条{ code: 0, msg: ok, data: [ {id: 1, name: 张亮, email: zhangliangexample.com, createtime: 2024-05-01 10:20:30} ] }注意 URL 里的中文curl 一般能自动处理如果遇到编码问题可以用--data-urlencode配合 GET 的-Gcurl -s -G http://127.0.0.1:5590/api/users --data-urlencode name张亮用 Postman 的话方法选 GETURL 填http://127.0.0.1:5590/api/users在 Params 里加一个name张亮点 SendBody 选 Pretty JSON就能看到和上面一样的结构。你原来用 POST request.json.get(username)也行但查询类操作语义上更推荐 GET参数放 query string缓存和调试都更友好。如果坚持 POST把路由改成methods[POST]然后payload request.get_json(silentTrue) or {} name payload.get(username)这里silentTrue很关键请求体不是合法 JSON 时不会直接抛 400而是返回None你再兜底成空字典接口更健壮。验证成功的标志有三个HTTP 状态码 200、Content-Type是application/json、data是数组且每个元素是对象。只要这三点满足前端和 AI 工具就能正常消费这份数据了。5. 本篇常见报错排查500、datetime、401 与连接问题这一节把你可能撞上的坑集中列一下都是真实会遇到的。报错一TypeError: Object of type datetime is not JSON serializable这是最经典的。原因就是查询结果里有DATETIME/DATE/TIMESTAMP字段Python 的datetime对象不是 JSON 原生类型。解决方式就是第 3 节的row_to_dict逐字段判断并strftime。如果你用json.dumps也可以传defaultstrjson.dumps(data, ensure_asciiFalse, defaultstr)defaultstr会让序列化器遇到不认识的对象时调用str()简单粗暴但有效。不过更推荐显式转换格式可控。报错二接口返回 500日志里是pymysql.err.OperationalError: (2003, Cant connect to MySQL server)数据库连不上。检查三件事MySQL 服务是否启动systemctl status mysql或看服务面板DB_HOST/DB_PORT是否正确本机就是127.0.0.1:3306账号密码和库名是否匹配。如果你在容器里跑 Flask、MySQL 在宿主机127.0.0.1会指向容器自己要换成宿主机的可达地址。报错三pymysql.err.ProgrammingError: (1064, You have an error in your SQL syntax)SQL 写错了常见于表名/字段名拼错或者用了 MySQL 保留字比如把字段叫order、key没加反引号。把拼好的 SQL 打印出来复制到 MySQL 客户端里跑一遍能快速定位。报错四请求 AI 服务时返回 401 /local proxy failed/OAuth相关错误这类错误通常不是 Flask 本身的问题而是调用外部 API 时鉴权或地址配错了。如果你把 Base URL 写成了别的地址或者 Key 过期、拼写错误就会 401。统一到 TaoToken 后Base URL 固定https://taotoken.net/apiKey 从控制台重新生成一个再试。local proxy failed多半是本机网络或地址填错确认请求地址没有多余路径、没有拼错域名。OAuth 类报错则要检查你用的客户端比如某些 CLI 工具是否要求走特定的登录流程按文档 https://taotoken.net/doc 配置即可。报错五RuntimeError: Working outside of application context一般出现在你把数据库操作抽到独立函数、又在请求上下文外调用时。确保数据库操作都在路由函数内触发或者用app.app_context()包起来。报错六返回的 JSON 中文变成\u5f20\u4eaejsonify默认不会这样但如果你手动json.dumps没加ensure_asciiFalse中文就会被转义。加上这个参数即可。排查通用套路先看 Flask 控制台 traceback 最后一行那是真正的错误类型再看是不是数据库层pymysql.err还是序列化层TypeError最后用 curl 最小化复现排除 Postman 配置干扰。6. 把接口鉴权与 Base URL 统一到 TaoToken 的落地建议最后说说怎么把这套东西用顺。你的 Flask 接口本身可以加一层简单的鉴权比如校验请求头里的 token避免裸奔。同时把外部 AI 服务的调用也收敛到同一套配置。一个实用的做法是写个统一的配置模块# config.py import os class Config: DB_HOST os.environ.get(DB_HOST, 127.0.0.1) DB_PORT int(os.environ.get(DB_PORT, 3306)) DB_USER os.environ.get(DB_USER, root) DB_PASSWORD os.environ.get(DB_PASSWORD, ) DB_NAME os.environ.get(DB_NAME, zlnewschema) TAOTOKEN_BASE_URL os.environ.get(TAOTOKEN_BASE_URL, https://taotoken.net/api) TAOTOKEN_API_KEY os.environ.get(TAOTOKEN_API_KEY, )Flask 里from config import Config直接用AI 调用时也读同一份。这样你换环境、换 Key只动.env。关于 Key 的获取和管理统一在控制台操作https://taotoken.net/console/api-keys 。建议给不同项目建不同的 Key方便按项目排查用量和吊销。文档在 https://taotoken.net/doc 模型对话相关的接入看 https://taotoken.net/models 长期编码或 Agent 场景看 https://taotoken.net/coding-plan 。如果你用的是 Claude Code 这类工具它的配置里同样需要 Base URL、Key、Model ID 三件套把 Base URL 指向https://taotoken.net/apiKey 填控制台生成的Model ID 按文档填对应模型名即可。这样你的 Flask 数据接口和 AI 工具链共享同一套入口维护成本一下就降下来了。实测下来把地址和 Key 集中管理后最直观的好处是排错快了以前 401 要翻五六个文件找是哪配错了现在只看.env一处。接口返回的 JSON 结构也建议固定成{code, msg, data}三段式前端和 AI 解析都省心。到这一步你的 Flask MySQL 查询接口就算完整跑通了剩下的就是按业务加字段、加分页、加缓存。
延伸阅读

更多相关文章

2026/10/12 10:11:09

Matlab 2019b Audio Toolbox设备测试踩坑与实战指南

联调踩坑记:Matlab 2019b Audio Toolbox 设备测试到底怎么搞搞音频处理、语音算法、声学仿真的人,应该都绕不开 Matlab。尤其是 2019b 的 Audio Toolbox,这个版本我从装完一直用到现在,期间做过不少音频设备的接入测试&#xff0c…

2026/10/12 10:11:09

AutoJS实战:安卓短视频App自动化脚本完整开发指南

1. 项目背景与应用场景刷宝短视频是前几年挺火的一款看视频赚积分类应用,核心玩法就是刷视频、做任务、攒积分换现金。虽然现在热度下去了,但把它当作AutoJS的学习练手对象仍然非常合适——App结构不复杂、操作路径固定、界面元素容易定位,新…

2026/10/12 10:11:09

open-code-review:自托管代码评审工作流的设计与落地实践

1. 为什么“代码评审”这件事值得单独拎出来做第一次听到“open-code-review”这个说法,很多人会下意识觉得它不过是又一个代码托管平台自带的合并请求功能。但真正在团队里做过一段时间评审的人都知道,平台自带的评审工具解决的是“流程承载”问题&…

2026/10/12 16:42:43

Codex智能体全场景自动化:从代码补全到工程闭环执行

最初接触到Codex智能体,是在一次工期紧张到想掀桌的任务里:要把某个老项目的工具函数拆到独立模块,顺带修掉一堆历史遗留的边界问题。我当时只是抱着试一试的心态,把需求丢给智能体,结果它自己列计划、逐个文件修改、跑…

2026/10/12 16:42:43

信道这章别死记:恒参/随参、多径衰落和香农公式一次讲透

通信原理学到信道这一章,很多人的第一反应是:信道不就是一根线或者一段空气吗,有什么好研究的?等你看完樊昌信、曹丽娜第七版教材的第四章,就知道事情远没有那么简单。信道是整个通信系统模型里最不受我们控制的一环&a…

2026/10/12 16:42:43

编译原理实验全解析:词法分析、NFA转DFA、递归下降与LL(1)语法分析

简介:编译原理是计算机科学的核心课程,编译器前端由词法分析和语法分析构成。词法分析基于有限自动机将源代码转换为记号流,语法分析则依赖上下文无关文法验证程序结构。针对非确定性自动机,子集构造法利用ε闭包与move函数实现NF…

2026/10/12 16:42:43

富士施乐M118w完整版驱动安装指南:解决打印扫描问题

简介:富士施乐 DocuPrint M118w 打印机驱动完整版,面向使用该型号打印机的家庭与办公用户,用于解决设备在电脑上无法识别、打印中断、连接异常或驱动不兼容等常见问题。驱动兼容 32 位与 64 位 Windows 7、Windows 10 及 Windows 11&#xff…

2026/10/12 16:37:43

PyCharm手写BP神经网络求解Iris分类实战

简介:本资源是一份面向机器学习初学者与高校课程实践者的BP神经网络入门级实战项目,聚焦Iris经典数据集的三分类任务,完整呈现从理论理解到PyCharm环境编码实现的全流程。压缩包共4个文件(2个Python源码、1份Word实验报告、1个CSV…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/12 0:04:22

绝缘子缺陷检测数据集清洗与工业级训练实战指南

简介:本资源是面向电力AI研发人员、工业视觉工程师及智能巡检系统开发者的绝缘子缺陷检测专用YOLO格式数据集,解决无人机航拍场景下绝缘子破损、污闪、积雪等9类典型缺陷的精准识别与定位难题。数据集共2139张真实巡检图像(含训练/验证/测试集…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑