1. 从 SQLite 到 MySQL初学者最容易卡在哪Python 数据库编程快速入门这件事很多人第一步走得挺顺import sqlite3一个文件就是一张库建表、插入、查询几行代码就能跑通。可一旦要把本地脚本搬到远程 MySQL问题就集中爆发了——驱动装不上、连接参数写错、端口被挡、字符集乱码、事务忘了提交。SQLite 是零配置的嵌入式数据库MySQL 则是需要网络、账号、权限、字符集的客户端/服务端数据库这两者的心智模型完全不同。这篇面向 Python 初学者聚焦从 SQLite 过渡到 MySQL 的配置痛点。我会用 PyMySQL 作为驱动先给你一份可复制的config.toml骨架把连接参数从代码里抽出来再演示如何用 TaoToken 的统一 Key 管理接入凭证避免把密码硬编码在脚本里最后给出本地 SQLite 与远程 MySQL 双环境的最小可跑脚本一次跑通增删改查。适合已经会写基础 Python、想把自己的小工具从单机文件升级到远程数据库的人。核心检索词先摆出来Python 数据库编程、SQLite、MySQL、PyMySQL。SQLite 是 Python 内置的轻量级数据库适合本地单机MySQL 是主流的关系型数据库服务适合多端共享。PyMySQL 是 Python3 下连接 MySQL 的纯 Python 驱动不需要编译 C 扩展安装即用。理解这三者的定位后面的配置就不会乱。2. 前置准备TaoToken 统一 Key 与依赖安装在动手写连接代码之前先把两件事准备好驱动依赖和凭证管理。很多初学者把数据库密码直接写在pymysql.connect(passwordroot)里脚本一上传就泄露。更稳妥的做法是把凭证集中管理TaoToken 的统一 Key 机制正好解决这个问题——你可以在一个地方维护访问凭证脚本通过环境变量或配置文件读取而不是散落在各处。TaoToken 的定位是统一管理你的 API 访问凭证让不同工具、不同脚本共享同一套 Key 配置。对于数据库编程场景你可以把连接所需的敏感信息主机、端口、账号、密码通过它的控制台统一登记再在本地用环境变量注入。这样换机器、换项目时不用到处翻密码。先去控制台创建你的 Key地址是 https://taotoken.net/api-keys 登录后按提示生成即可。生成后不要直接贴进代码而是写进本地环境变量或.env文件。如果你还想先验证一下 Key 是否可用可以打开模型对话页面 https://taotoken.net/models 做一次简单调用测试确认凭证链路是通的。依赖安装部分PyMySQL 一条命令搞定pip install pymysql如果你打算用config.toml管理配置Python 3.11 起标准库自带tomllib可以读取低于 3.11 的版本装一个tomlipip install tomliSQLite 不需要额外安装sqlite3是 Python 标准库的一部分。所以整个环境准备就是一个 PyMySQL、一个可选的 TOML 读取库加上你在 TaoToken 控制台拿到的 Key。装完后用pip show pymysql确认版本避免装到一半网络中断导致半成品。3. 可复制配置config.toml 骨架与连接封装把连接参数从代码里抽出来是初学者迈向工程化的第一步。下面这份config.toml骨架你可以直接复制分成 SQLite 和 MySQL 两个 sectionMySQL 部分用环境变量占位实际值从 TaoToken 统一 Key 对应的环境变量读取。# config.toml [sqlite] database local.db [mysql] host 127.0.0.1 port 3306 user app_user password_env TAOTOKEN_DB_PASSWORD # 从环境变量读取不写明文 database demo charset utf8mb4 [taotoken] api_base https://taotoken.net/api api_key_env TAOTOKEN_API_KEY注意password_env这一项它存的是环境变量的名字而不是密码本身。运行时用os.environ取值。这样即使config.toml被提交到仓库也不会泄露真实密码。TaoToken 的统一 Key 就通过TAOTOKEN_API_KEY注入脚本里只引用变量名。接着写一个读取配置并建立连接的封装模块db.py# db.py import os import sqlite3 import pymysql try: import tomllib # Python 3.11 except ModuleNotFoundError: import tomli as tomllib # 低版本回退 def load_config(pathconfig.toml): with open(path, rb) as f: return tomllib.load(f) def get_sqlite_conn(cfg): return sqlite3.connect(cfg[sqlite][database]) def get_mysql_conn(cfg): m cfg[mysql] password os.environ.get(m[password_env]) if not password: raise RuntimeError(f环境变量 {m[password_env]} 未设置) return pymysql.connect( hostm[host], portm[port], userm[user], passwordpassword, databasem[database], charsetm[charset], cursorclasspymysql.cursors.DictCursor, )这里有几个关键参数值得说明。charsetutf8mb4是必须的MySQL 默认的utf8只支持三字节存 emoji 或部分生僻字会报错utf8mb4才是完整的四字节 UTF-8。cursorclassDictCursor让查询结果以字典返回比默认的元组可读性好得多字段名直接当 key 用。port默认 3306如果你本地 MySQL 改过端口记得同步。设置环境变量的方式Linux/macOS 用exportWindows PowerShell 用$env:# Linux / macOS export TAOTOKEN_DB_PASSWORD你的数据库密码 export TAOTOKEN_API_KEY你的TaoToken Key# Windows PowerShell $env:TAOTOKEN_DB_PASSWORD你的数据库密码 $env:TAOTOKEN_API_KEY你的TaoToken Key如果你需要长期编码或跑 Agent 类任务建议把这类凭证管理纳入 Coding Plan地址是 https://taotoken.net/coding-plan 统一维护比每次手动 export 省心。4. 双环境验证SQLite 与 MySQL 一次跑通增删改查配置就绪后写一个脚本同时验证两个环境。先建表、插入、查询、更新、删除把 CURD 走一遍。SQLite 部分用标准库MySQL 部分用 PyMySQL两边逻辑对齐方便你对比差异。# demo_crud.py from db import load_config, get_sqlite_conn, get_mysql_conn cfg load_config() def crud_sqlite(): conn get_sqlite_conn(cfg) cur conn.cursor() cur.execute(CREATE TABLE IF NOT EXISTS stocks (date TEXT, trans TEXT, symbol TEXT, qty REAL, price REAL)) cur.execute(INSERT INTO stocks VALUES (?, ?, ?, ?, ?), (2024-05-01, BUY, RHAT, 100, 35.14)) conn.commit() cur.execute(SELECT symbol, qty FROM stocks WHERE trans ?, (BUY,)) print(SQLite 查询:, cur.fetchall()) cur.execute(UPDATE stocks SET qty ? WHERE symbol ?, (150, RHAT)) conn.commit() cur.execute(DELETE FROM stocks WHERE symbol ?, (RHAT,)) conn.commit() conn.close() def crud_mysql(): conn get_mysql_conn(cfg) try: with conn.cursor() as cur: cur.execute( CREATE TABLE IF NOT EXISTS employee ( id INT PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(20) NOT NULL, last_name VARCHAR(20), age INT, sex CHAR(1), income FLOAT ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 ) cur.execute( INSERT INTO employee (first_name, last_name, age, sex, income) VALUES (%s, %s, %s, %s, %s), (Chan, Zany, 20, M, 2000.0), ) conn.commit() cur.execute(SELECT first_name, age, income FROM employee WHERE income %s, (1000,)) print(MySQL 查询:, cur.fetchall()) cur.execute(UPDATE employee SET age age 1 WHERE sex %s, (M,)) conn.commit() cur.execute(DELETE FROM employee WHERE age %s, (100,)) conn.commit() except pymysql.MySQLError as e: conn.rollback() print(MySQL 出错已回滚:, e) finally: conn.close() if __name__ __main__: crud_sqlite() crud_mysql()运行python demo_crud.py如果两边都打印出查询结果说明链路通了。SQLite 输出类似[(RHAT, 100.0)]MySQL 输出类似[{first_name: Chan, age: 20, income: 2000.0}]。这里有个初学者常忽略的点SQLite 的占位符是?MySQL 的 PyMySQL 用%s。两者不能混用写错会直接抛异常。另外 MySQL 的INSERT、UPDATE、DELETE之后必须commit()否则数据不会真正落库SQLite 同样需要 commit但很多人用with conn上下文自动提交容易忘记显式调用。如果你在验证过程中想确认 TaoToken 的 Key 是否配置正确可以回到模型对话页面 https://taotoken.net/models 做一次调用确认凭证有效后再排查数据库侧的问题能少走弯路。5. 本篇常见错误排查从 SQLite 切到 MySQL报错集中在几个固定位置。下面按出现频率排列遇到问题先对照这里。驱动未安装或版本不对。报错ModuleNotFoundError: No module named pymysql说明没装或装到了别的 Python 环境。用python -m pip install pymysql明确指定解释器避免多版本 Python 装错地方。连接被拒绝。报错(2003, Cant connect to MySQL server on 127.0.0.1)先确认 MySQL 服务是否启动再确认端口。本地默认 3306如果你用容器映射到别的端口config.toml里的port要同步改。远程主机还要确认防火墙放行了该端口。认证失败。报错(1045, Access denied for user)检查用户名、密码、以及该用户是否有从当前主机连接的权限。MySQL 的账号是userhost形式app_userlocalhost和app_user%是两回事远程连接需要后者或对应网段授权。字符集乱码。存中文变成问号或乱码检查建表时是否指定CHARSETutf8mb4连接参数是否带charsetutf8mb4。两者缺一不可只改连接不改表结构旧表仍然是错的字符集。事务未提交。插入成功但查询不到多半是忘了commit()。PyMySQL 默认关闭自动提交conn.commit()必须显式调用。用try/except包住出错时rollback()避免脏数据。占位符写错。把 SQLite 的?用到 MySQL报(1064, You have an error in your SQL syntax)。记住 MySQL 用%s且参数以元组或列表传入不要用字符串拼接否则有 SQL 注入风险。环境变量未生效。报RuntimeError: 环境变量 TAOTOKEN_DB_PASSWORD 未设置说明 export 没在当前 shell 生效或者脚本在另一个终端跑。确认echo $TAOTOKEN_DB_PASSWORD有输出再运行脚本。排查顺序建议先确认驱动再确认网络和端口然后认证最后字符集和事务。按这个顺序绝大多数问题能在三分钟内定位。6. 把凭证和连接统一管起来走到这里你已经能用一份config.toml同时驱动 SQLite 和 MySQLCURD 也跑通了。接下来真正影响长期效率的是凭证和连接的管理方式。把密码写死在代码里换环境就要改代码把连接参数散落在各个脚本维护成本会随项目增长而爆炸。TaoToken 的统一 Key 思路值得借鉴敏感信息集中登记脚本只引用变量名。数据库密码、API Key 都走环境变量注入config.toml只存变量名不存值。这样你的代码可以安全地提交到仓库换机器时只需重新设置环境变量。如果你后续要接入更多模型或工具可以在控制台 https://taotoken.net/console 统一查看和管理你的 Key。需要查阅接入细节时文档在 https://taotoken.net/doc 。对于长期跑编码任务或 Agent 的场景Coding Plan 能把凭证管理和调用配额一起管起来省去反复配置的麻烦。最后留一个实用习惯每次新建项目先写config.toml骨架再写db.py封装最后才写业务逻辑。这个顺序看起来多花五分钟但能让你在换数据库、换环境时只改配置不改代码。数据库编程的坑一大半都出在配置散乱上把配置收拢问题就少了一半。