1. Ubuntu 下 Python 连 MySQL 到底卡在哪
在 Ubuntu 上写 Python 脚本操作 MySQL,看着简单,实际动手时经常卡在几个地方:pymysql 装完 import 报错、连接参数写错端口、远程连不上 3306、增删改忘了 commit 导致数据没落库。更麻烦的是,当项目里同时要调模型 API、跑数据库读写、还要管理一堆 Key 的时候,配置散落在各个文件里,改一个地方要翻半天。
这篇就聚焦一条完整链路:Ubuntu 环境 → 安装 pymysql → 写连接脚本 → 用 TaoToken 统一 Key 管理 API 通道 → 配置文件骨架 → 连通性验证。适合刚接触 Python 数据库操作、或者想把 API Key 和数据库配置统一管理的开发者。读完你能直接复制脚本跑通读写,也能拿到 settings.json 和 config.toml 两份配置模板。
核心检索词先明确:pymysql 是 Python 操作 MySQL 的纯 Python 驱动,不需要编译 C 扩展,Ubuntu 上 pip 装完就能用;TaoToken 在这里的角色是统一 API Key 通道,把模型调用、编码 Agent 等入口的鉴权收敛到一个 Key 上,避免每个服务单独配一套凭证。
2. 前置准备:Ubuntu 环境与 TaoToken Key
2.1 Ubuntu 侧基础依赖
先确认 Python 和 pip 版本。Ubuntu 20.04 以上一般自带 Python3,但 pip 可能要单独装:
sudo apt update sudo apt install python3 python3-pip python3-venv -y python3 --version pip3 --versionMySQL 服务端和客户端都装上,server 负责数据存储和查询处理,client 提供命令行交互入口:
sudo apt install mysql-server mysql-client -y sudo systemctl status mysql服务起来后,进 MySQL 建一个测试库和表,后面脚本要用:
CREATE DATABASE school CHARACTER SET utf8mb4; USE school; CREATE TABLE category ( categoryid INT PRIMARY KEY, pid INT, categoryName VARCHAR(64) ); INSERT INTO category VALUES (1, 0, '后端开发'), (2, 1, 'Python');2.2 TaoToken 统一 Key 的定位
TaoToken 在这里不是替代 MySQL,而是把 API 鉴权统一起来。你可以在官网注册后拿到一个 Key,然后模型对话、Coding Plan、API 调用都走这一个凭证。对项目来说,好处是配置文件里不用散落多个 Key,换环境时只改一处。
拿 Key 的入口在控制台,登录后进 API Keys 页面创建。创建完复制保存,后面写进配置文件。注意 Key 只显示一次,丢了就重新生成。
提示:TaoToken 的 API 基地址是 https://taotoken.net/api,配置时不要带多余路径,SDK 会自动拼接。
3. 可复制配置:pymysql 安装与配置文件骨架
3.1 安装 pymysql 并验证
建议用虚拟环境隔离依赖,避免和系统包冲突:
cd ~/projects python3 -m venv venv source venv/bin/activate pip install pymysql pip show pymysqlpip show能看到版本号和安装路径就说明装好了。如果 import 报 ModuleNotFoundError,八成是虚拟环境没激活,或者用了系统 python 而不是 venv 里的。
3.2 settings.json 骨架
这个文件放数据库连接参数和 TaoToken Key,适合被 Python 脚本读取:
{ "database": { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "your_mysql_password", "database": "school", "charset": "utf8mb4" }, "taotoken": { "api_base": "https://taotoken.net/api", "api_key": "sk-你的TaoTokenKey", "default_model": "claude-sonnet" } }读取时用标准库 json 就行,不用额外装包:
import json with open("settings.json", "r", encoding="utf-8") as f: cfg = json.load(f) db = cfg["database"] print(db["host"], db["port"], db["database"])3.3 config.toml 骨架
如果你更习惯 TOML 格式,Python 3.11 以上自带 tomllib,低版本装 tomli:
[database] host = "127.0.0.1" port = 3306 user = "root" password = "your_mysql_password" database = "school" charset = "utf8mb4" [taotoken] api_base = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey" default_model = "claude-sonnet"读取方式:
import tomllib with open("config.toml", "rb") as f: cfg = tomllib.load(f) print(cfg["database"]["host"])两种格式选一种就行,JSON 通用性好,TOML 可读性强。团队项目里建议统一,别混用。
4. 验证请求:连接脚本与读写实测
4.1 查询脚本
把连接、游标、执行、取结果、关闭串起来,注意异常处理和资源释放:
import pymysql import json with open("settings.json", "r", encoding="utf-8") as f: db = json.load(f)["database"] conn = None cur = None try: conn = pymysql.connect( host=db["host"], port=db["port"], user=db["user"], password=db["password"], database=db["database"], charset=db["charset"], cursorclass=pymysql.cursors.DictCursor ) cur = conn.cursor() cur.execute("SELECT * FROM category") rows = cur.fetchall() for row in rows: print(row) except Exception as e: print("查询失败:", e) finally: if cur: cur.close() if conn: conn.close()DictCursor让结果以字典返回,字段名直接当 key 用,比默认元组好读。
4.2 增删改脚本
增删改和查询的区别就一步:必须 commit。不 commit 的话,连接关闭时改动会回滚,你会以为写成功了其实没有:
import pymysql import json with open("settings.json", "r", encoding="utf-8") as f: db = json.load(f)["database"] conn = None cur = None try: conn = pymysql.connect(**db, cursorclass=pymysql.cursors.DictCursor) cur = conn.cursor() cur.execute( "INSERT INTO category (categoryid, pid, categoryName) VALUES (%s, %s, %s)", (9, 3, "计算机科学与技术") ) cur.execute( "UPDATE category SET categoryName=%s WHERE categoryid=%s", ("Python工程师", 2) ) cur.execute("DELETE FROM category WHERE categoryid=%s", (5,)) conn.commit() print("写入成功,影响行数:", cur.rowcount) except Exception as e: if conn: conn.rollback() print("写入失败已回滚:", e) finally: if cur: cur.close() if conn: conn.close()参数化查询用%s占位,别用字符串拼接,否则有 SQL 注入风险。
4.3 连通性验证命令
不想写脚本时,用命令行快速验证:
mysql -h 127.0.0.1 -P 3306 -u root -p -e "SELECT NOW(), DATABASE();"Python 侧验证 pymysql 能否连上:
python3 -c " import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='your_password', database='school') print('连接成功', conn.get_server_info()) conn.close() "两条都通,说明链路没问题。
5. 本篇常见错排查
5.1 pymysql 报 Access denied
密码错、用户没权限、或者 host 不匹配。MySQL 里 root 默认只允许 localhost 登录,远程连要单独授权:
CREATE USER 'root'@'%' IDENTIFIED BY '密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;改完记得检查 MySQL 的 bind-address,默认可能是 127.0.0.1,远程访问要改成 0.0.0.0 并重启服务。
5.2 中文乱码
连接参数 charset 写 utf8mb4,建库建表也用 utf8mb4。如果历史数据已经是乱码,改连接参数救不回来,得重新导入。
5.3 增删改没生效
九成是忘了conn.commit()。pymysql 默认 autocommit 关闭,所有写操作都在事务里,不提交就回滚。可以在连接时加autocommit=True,但显式 commit 更可控。
5.4 TaoToken Key 读取失败
检查 settings.json 里 Key 有没有多余空格,JSON 格式是否合法。用python3 -m json.tool settings.json验证格式。Key 泄露了就去控制台重新生成,旧 Key 立即失效。
6. 统一 Key 通道的后续接入
数据库链路跑通后,如果你还要在同一个项目里调模型 API 或跑编码 Agent,TaoToken 的统一 Key 就能派上用场。把 Key 写进 settings.json 的 taotoken 段,脚本里读出来传给 SDK 即可,不用每个服务单独配凭证。
需要管理 Key 或查看用量,进控制台;想先试模型对话效果,用模型对话页面;长期跑编码任务或 Agent,看 Coding Plan 的额度方案;接入细节查接入文档。API 基地址统一用 https://taotoken.net/api,SDK 会自动拼接路径。
实测下来,把数据库配置和 API Key 放同一个配置文件里,换机器时只改一个文件就能跑,比散落在环境变量和代码里省事。配置文件记得加进 .gitignore,别把密码和 Key 提交到仓库。