Python 操作 MySQL 增删改查:TaoToken 统一 Key 接入与 config.toml 配置骨架
发布时间:2026/9/27 21:25:38来源:尧图网络
1. 为什么 Python 操作 MySQL 需要一个统一 Key 通道很多同学第一次写 Python 连 MySQL都是把host、user、passwd直接硬编码在脚本里。本地跑没问题一旦脚本变多、要换环境、要交给同事就会变成一团乱麻密码散落在十几个文件里改一次要全局搜索替换还容易把生产库的账号误提交到仓库。这篇要解决的就是这个工程化问题用一份config.toml把数据库连接参数和统一 Key 收拢起来Python 侧只负责读取配置、注入 Key、执行增删改查。适合本地脚本、定时任务、小型服务这类场景——不需要上复杂的配置中心但也不想再手写一堆连接字符串。核心检索词先摆出来Python 操作 MySQL 的增删改查CRUD配合统一 Key 接入与config.toml配置骨架。读完你能拿到三样东西一份可直接复制的配置文件、一套 Key 注入方式、以及增删改查四类操作的验证动作和预期输出。数据库驱动我用PyMySQL因为它纯 Python、装起来干净语法和老的MySQLdb基本一致迁移成本低。2. TaoToken 前置统一 Key 与配置骨架的定位先说清楚 TaoToken 在这里扮演什么角色。它提供的是统一 Key / API 通道把模型调用、编码辅助这类能力收敛到一个 Key 上管理。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 这个不加 UTM。你可能会问数据库连接和统一 Key 有什么关系关系在于工程习惯。当你的脚本既要连 MySQL又要调用模型做数据处理、生成 SQL、做字段映射时如果每个能力都维护一套密钥配置会迅速失控。把 Key 统一放进config.toml数据库参数和 API Key 走同一套读取逻辑脚本里只出现settings.db和settings.api_key换环境只改一个文件。拿 Key 的路径很直接进控制台创建 API Key然后按需选择能力入口。模型对话调试走 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 长期编码或 Agent 场景走 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 用来管理 Key 和额度。注意Key 只放在本地config.toml或环境变量里不要写进代码、不要提交到 Git。.gitignore里加上config.toml是基本操作。3. 可复制配置config.toml 骨架与 Key 注入先装依赖。驱动用 PyMySQL配置解析用标准库tomllibPython 3.11 自带低版本用tomli兜底。pip install pymysql # Python 3.11 再装一个 pip install tomli下面是config.toml骨架数据库段和 API 段分开Key 用占位符实际值自己填[db] host 127.0.0.1 port 3306 user app_user password your_db_password database demo_db charset utf8mb4 [api] base_url https://taotoken.net/api api_key sk-替换成你的Key timeout 30读取配置的模块settings.py把 Key 注入逻辑集中在这里。优先读环境变量读不到再回落到config.toml这样 CI 环境不用改文件import os try: import tomllib except ModuleNotFoundError: import tomli as tomllib CONFIG_PATH os.getenv(APP_CONFIG, config.toml) def load_settings(pathCONFIG_PATH): with open(path, rb) as f: cfg tomllib.load(f) # 环境变量优先方便容器/CI 注入 cfg[api][api_key] os.getenv(TAOTOKEN_API_KEY, cfg[api][api_key]) cfg[db][password] os.getenv(DB_PASSWORD, cfg[db][password]) return cfg settings load_settings()数据库连接封装成上下文管理器避免忘记关连接。注意charset要和建库时一致中文乱码十有八九是这里对不上import pymysql from settings import settings def get_conn(): return pymysql.connect( hostsettings[db][host], portsettings[db][port], usersettings[db][user], passwordsettings[db][password], databasesettings[db][database], charsetsettings[db][charset], cursorclasspymysql.cursors.DictCursor, )DictCursor让查询结果以字典返回字段名直接当 key 用比元组下标可读性好太多。建表语句先准备好CREATE TABLE IF NOT EXISTS admin ( id INT PRIMARY KEY AUTO_INCREMENT, user VARCHAR(20) NOT NULL, passwd VARCHAR(20) NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;4. 增删改查四类操作的验证与预期输出4.1 插入单条与批量插入必须commit()否则数据只在事务里连接一关就没了。这是新手最常见的坑。from db import get_conn def insert_one(user, passwd): with get_conn() as conn: with conn.cursor() as cur: sql INSERT INTO admin(user, passwd) VALUES(%s, %s) rows cur.execute(sql, (user, passwd)) conn.commit() return rows def insert_many(pairs): with get_conn() as conn: with conn.cursor() as cur: sql INSERT INTO admin(user, passwd) VALUES(%s, %s) rows cur.executemany(sql, pairs) conn.commit() return rows print(insert_one(alex, usa)) # 预期输出 1 print(insert_many([(song, 222aaa), (shi, 333bbb)])) # 预期输出 2execute和executemany返回的都是受影响行数单条是 1批量是列表长度。占位符统一用%s不管字段是什么类型PyMySQL 会帮你转义别用字符串拼接那是 SQL 注入的入口。4.2 查询fetchone / fetchmany / fetchall 与游标定位查询不涉及事务提交但游标位置会影响结果。fetchone取一条fetchmany(n)取 n 条fetchall取全部scroll用来移动游标。def query_demo(): with get_conn() as conn: with conn.cursor() as cur: count cur.execute(SELECT * FROM admin ORDER BY id) print(影响行数:, count) cur.scroll(0, modeabsolute) # 回到第 0 行 print(第一条:, cur.fetchone()) print(第二条:, cur.fetchone()) cur.scroll(0, modeabsolute) print(前三条:, cur.fetchmany(3)) cur.scroll(0, modeabsolute) print(全部:, cur.fetchall()) query_demo()预期输出类似id 从 1 开始字典形式影响行数: 3 第一条: {id: 1, user: alex, passwd: usa} 第二条: {id: 2, user: song, passwd: 222aaa} 前三条: [{id: 1, ...}, {id: 2, ...}, {id: 3, ...}] 全部: [{id: 1, ...}, {id: 2, ...}, {id: 3, ...}]scroll的规则记牢modeabsolute时 value 必须 ≥0表示绝对索引moderelative时 value 可正可负正数前进、负数回退。取完fetchall后游标在末尾想再取必须scroll回去。4.3 更新与删除条件与影响行数更新和删除同样要commit()并且用WHERE精确限定否则全表遭殃。返回值是受影响行数可以用来判断操作是否命中。def update_passwd(user, new_passwd): with get_conn() as conn: with conn.cursor() as cur: rows cur.execute( UPDATE admin SET passwd%s WHERE user%s, (new_passwd, user) ) conn.commit() return rows def delete_by_id(row_id): with get_conn() as conn: with conn.cursor() as cur: rows cur.execute(DELETE FROM admin WHERE id%s, (row_id,)) conn.commit() return rows print(update_passwd(song, 123123)) # 预期输出 1 print(delete_by_id(3)) # 预期输出 1 print(delete_by_id(999)) # 预期输出 0没命中命中返回 1没命中返回 0这个返回值可以直接拿来做业务判断比再查一次库省事。5. 本篇常见错排查中文乱码数据库、表、连接三处编码要一致。建库用utf8mb4连接参数charsetutf8mb4config.toml里别写成utf8或漏掉。乱码基本就是这三处有一处对不上。数据插了但查不到忘了commit()。PyMySQL 默认不开自动提交execute之后不提交连接关闭时事务回滚数据就没了。要么显式commit要么连接时加autocommitTrue但后者不利于批量操作的事务控制建议还是手动提交。ModuleNotFoundError: No module named MySQLdb老代码用的是MySQLdb新环境装不上。换成PyMySQL并在入口加一行pymysql.install_as_MySQLdb()做兼容或者直接把 import 改掉。tomllib导入失败Python 3.11 以下没有tomllib装tomli并按上面的 try/except 写法兜底。Key 读取为空检查环境变量名和config.toml里的字段是否对得上load_settings里环境变量优先如果设了空字符串会覆盖文件值用os.getenv时注意区分「未设置」和「设为空」。游标取不到数据fetchall之后游标在末尾再fetchone返回None需要scroll回起点。这是游标语义不是 bug。6. 把配置和 Key 收拢后的下一步到这里config.toml管住了数据库参数和统一 Keysettings.py负责注入db.py负责连接增删改查四个函数各自独立、可单独测试。这套骨架的价值在于换数据库只改config.toml换 Key 只改环境变量或一行配置业务代码不动。如果你还要在脚本里接模型能力做 SQL 生成、字段清洗Key 已经在同一份配置里了直接读settings[api][api_key]即可接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。调试模型对话去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 长期编码任务用 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。建议你现在就把config.toml加进.gitignore然后跑一遍上面的插入和查询确认输出和预期一致再往业务里接。
网站建设高端定制企业官网