python3 + pymysql 创建数据库:从连接参数到建库建表的可复现脚本 1. 本地 Python3 用 pymysql 创建数据库时最容易踩的坑很多人第一次写python3 pymysql 创建数据库的脚本代码看着没问题运行却报Access denied、Unknown database或者中文变问号。问题往往不在 SQL 本身而在连接参数、字符集和执行顺序上。这篇就按“能一次跑通”的目标把连接配置、建库建表、异常处理和验证步骤串成一条完整链路。先说清楚这套东西是什么、能做什么、适合谁。pymysql 是 Python3 里纯 Python 实现的 MySQL 客户端库不需要编译 C 扩展pip install pymysql就能用。它能做的事包括连接 MySQL 服务、执行任意 SQL、读取查询结果、管理事务。适合的人群很明确——本地做数据分析要自动建库的、写小工具需要初始化表结构的、教学演示里不想装 mysql-connector 的以及用脚本批量管理多个数据库的开发者。这里有个关键认知创建数据库和创建表是两个不同层级的操作。CREATE DATABASE属于服务器级操作连接时甚至可以不指定 database而CREATE TABLE必须先USE某个库或者在连接参数里指定database。很多脚本报错就是因为把这两步混在一起连接时写了一个还不存在的库名结果连接阶段就失败了。我试过最典型的翻车场景连接参数里写了databasemydb但mydb还没创建pymysql 直接抛Unknown database mydb。正确做法是先用不指定 database 的连接建库再重新连接或切换库去建表。这个顺序问题比 SQL 语法错误更隐蔽。另外字符集要统一成utf8mb4。MySQL 里utf8是残缺的三字节实现存 emoji 或部分生僻字会出问题utf8mb4才是完整的四字节 UTF-8。建库、建表、连接三处字符集要一致否则中文和特殊符号会出现乱码或写入失败。还有一个容易被忽略的点CREATE DATABASE IF NOT EXISTS和CREATE TABLE IF NOT EXISTS的幂等性。脚本要能重复执行不报错就必须带上IF NOT EXISTS否则第二次运行直接抛database exists。这在自动化脚本里是刚需。理解了这些后面的配置和代码就是水到渠成。下面先把 TaoToken 这个统一通道的前置准备讲清楚再进入可复制的脚本。2. TaoToken 统一 Key 与 API 通道的前置准备在写数据库脚本之前先说明一下为什么这里要提 TaoToken。如果你的项目里除了本地 MySQL 操作还要调用大模型做数据处理、SQL 生成或结果分析那么把模型调用统一到一个 Key 通道上会省很多事。TaoToken 提供统一 Key/API 通道官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。前置准备分三步。第一步是拿到 Key。进入控制台页面 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 管理页 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建一个新 Key复制保存好后面配置里会用到。第二步是确认你要用的模型 ID这个在模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 能看到当前可用的模型列表。第三步是决定接入方式如果只是偶尔验证模型输出用模型对话页直接试如果是长期编码或跑 Agent 任务走 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 更划算。这里要强调一个配置三件套的概念Base URL Key Model ID三者缺一不可。Base URL 统一填https://taotoken.net/apiKey 用刚才创建的那串Model ID 按你选的模型填。不管是 Cline、Claude Code 还是 Codex 这类工具配置逻辑都一样只是文件位置不同。比如 Claude Code 的接入需要在配置里指定 Anthropic 兼容的 Base URL 和 Key文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 有详细说明。Codex 则是在auth.json里写 Key配合config.toml指定模型和 Base URL。Cline 的 MCP 配置也是同样的三件套思路。需要提醒的是TaoToken 在这里的角色是模型调用的统一通道不是数据库工具也不替代任何编辑器。数据库连接还是走本地 MySQL 和 pymysql两者是配合关系脚本负责建库建表模型通道负责后续的智能处理。把这两条线分开理解配置就不会乱。准备好 Key 之后回到数据库主线。下面进入可复制的连接配置和建库脚本。3. 可复制的 pymysql 连接配置与建库建表脚本这一节给出完整可运行的代码。先看连接配置建议单独抽成一个字典或配置文件方便复用。# db_config.py DB_CONFIG { host: localhost, port: 3306, user: root, password: 123456, charset: utf8mb4, autocommit: True, }注意这里没有写 database 字段因为建库阶段库还不存在。autocommitTrue让建库语句立即生效避免忘记 commit。字符集统一utf8mb4。接下来是建库建表的主脚本# create_db.py import pymysql from pymysql import err from db_config import DB_CONFIG DB_NAME demo_db def create_database(): conn pymysql.connect(**DB_CONFIG) try: with conn.cursor() as cursor: sql ( fCREATE DATABASE IF NOT EXISTS {DB_NAME} DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ) cursor.execute(sql) print(f数据库 {DB_NAME} 已就绪) finally: conn.close() def create_tables(): cfg dict(DB_CONFIG) cfg[database] DB_NAME conn pymysql.connect(**cfg) try: with conn.cursor() as cursor: sql CREATE TABLE IF NOT EXISTS employee ( id INT NOT NULL AUTO_INCREMENT, topic INT, ptid INT NOT NULL, level INT NOT NULL, time TIME, consume INT NOT NULL, err INT NOT NULL, points INT NOT NULL, gid INT NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; cursor.execute(sql) print(表 employee 已就绪) finally: conn.close() if __name__ __main__: try: create_database() create_tables() except err.OperationalError as e: print(f连接或权限错误: {e}) except err.ProgrammingError as e: print(fSQL 语法错误: {e})这段代码的关键设计点建库和建表分成两个函数各自独立连接。建表时通过cfg[database] DB_NAME指定库名这样连接阶段库已经存在不会报Unknown database。所有 SQL 都带IF NOT EXISTS脚本可以反复执行。如果你想把模型调用也接进来比如让模型根据表结构生成查询可以在配置里加一段{ base_url: https://taotoken.net/api, api_key: 你的Key, model_id: 你选的模型ID }这个 JSON 片段对应前面说的三件套Base URL 固定Key 和 Model ID 按实际填。它和数据库配置是并列关系不要混在同一个字典里避免职责不清。执行顺序上先跑create_database()再跑create_tables()这个顺序不能反。如果反过来建表连接会因为库不存在直接失败。4. 执行验证请求与成功结果确认脚本写完后要验证是否真的跑通。第一步直接运行python3 create_db.py预期输出数据库 demo_db 已就绪 表 employee 已就绪看到这两行说明建库建表成功。再运行一次输出应该完全一样不会报错这就是幂等性的验证。第二步用命令行确认结构。登录 MySQLmysql -u root -p然后执行SHOW DATABASES LIKE demo_db; USE demo_db; SHOW TABLES; DESC employee;SHOW DATABASES应该能看到demo_dbSHOW TABLES显示employeeDESC employee列出九个字段和主键。字符集可以用SHOW CREATE TABLE employee;确认输出里应该是CHARSETutf8mb4。第三步做一次写入读取验证确保字符集没问题import pymysql from db_config import DB_CONFIG cfg dict(DB_CONFIG) cfg[database] demo_db conn pymysql.connect(**cfg) with conn.cursor() as cursor: cursor.execute( INSERT INTO employee (topic, ptid, level, consume, err, points, gid) VALUES (%s, %s, %s, %s, %s, %s, %s), (1, 100, 2, 30, 0, 10, 5) ) cursor.execute(SELECT id, topic, points FROM employee) print(cursor.fetchall()) conn.close()能打印出插入的行说明建表结构、字段类型、字符集全部正确。如果中文测试也想验证把topic换成带中文的字段测试即可。如果你同时配置了模型通道可以顺手验证一下 Key 是否可用在模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 发一条测试消息能正常返回就说明通道没问题。这一步和数据库验证是独立的分开确认更清晰。5. 本篇常见报错排查对照表跑脚本时遇到的报错基本集中在几类下面按真实错误信息对照排查。报错一pymysql.err.OperationalError: (1045, Access denied for user rootlocalhost)这是账号密码错误或权限不足。检查DB_CONFIG里的user和password是否和 MySQL 实际一致。如果密码里有特殊字符确认没有被转义。还有一种情况是 root 只允许 socket 登录需要改用有密码的普通账号。报错二pymysql.err.OperationalError: (2003, Cant connect to MySQL server on localhost)MySQL 服务没启动或者端口不对。先确认服务在跑systemctl status mysql或brew services list。端口默认 3306如果改过要同步改配置。报错三pymysql.err.OperationalError: (1049, Unknown database demo_db)这就是前面说的顺序问题——连接参数里指定了还不存在的库。检查建表函数是否在create_database()之后执行以及cfg[database]是否在库创建后才赋值。报错四pymysql.err.ProgrammingError: (1064, You have an error in your SQL syntax)SQL 语法错误常见于反引号写成单引号或者CREATE TABLE末尾多了逗号。把 SQL 打印出来逐字核对注意字段定义之间用逗号、最后一个字段后不加逗号。报错五中文写入后显示为???或乱码字符集不统一。检查三处连接参数charsetutf8mb4、建库DEFAULT CHARSET utf8mb4、建表DEFAULT CHARSETutf8mb4。任何一处写成utf8都可能出问题。报错六local proxy failed或401相关这类报错通常出现在模型通道配置上不是数据库问题。检查 Base URL 是否填成https://taotoken.net/apiKey 是否复制完整Model ID 是否在可用列表里。三件套缺一个都会失败。如果用的是 Claude Code 或 Codex确认配置文件路径正确auth.json和config.toml里的字段名没写错。报错七RuntimeError: cryptography is required for sha256_passwordMySQL 8 默认认证插件需要 cryptography 库。执行pip install cryptography即可解决。排查时建议按“连接层 → 权限层 → SQL 层 → 字符集层”的顺序定位大部分问题在前两层就能找到。6. 从建库脚本到模型通道的衔接建议脚本跑通之后实际项目里往往还要把数据库操作和模型调用串起来。比如让模型根据自然语言生成 SQL再交给 pymysql 执行。这时候统一 Key 通道的价值就体现出来了——不用为每个模型单独配 KeyBase URL 和鉴权方式一致。具体衔接方式数据库部分保持本文的DB_CONFIG不变模型部分单独维护一份配置两者通过业务代码组合。需要长期跑编码或 Agent 任务时走 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 能拿到更稳定的额度只是临时验证模型输出用模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 就够。Key 的创建和管理都在 API Keys 页 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入细节查文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。一个实用技巧把数据库配置和模型配置都放进环境变量或独立的配置文件代码里只读不写死。这样换环境、换 Key 都不用改脚本。建库脚本本身保持幂等配合 CI 或初始化流程每次部署自动执行一遍表结构就始终是最新的。