1. 从一段拼接字符串的 SQL 说起如果你写过 Python 连 MySQL 做模糊查询大概率见过甚至写过这样的代码把用户输入或业务字段切片后用%拼进 SQL 字符串里再cursor.execute(sql)一把梭。上面那段con1 %% b[0:14] %%就是典型写法——它确实能跑但一旦条件从 1 个变成 3 个、5 个字段名和切片位置散落在各处改一个条件要翻半天更麻烦的是字符串拼接天然带着 SQL 注入风险测试环境里随便输个带引号的值就可能报语法错。这篇要解决的就是这件事多个模糊查询条件怎么在 Python 里工程化地拼、怎么参数化、怎么把数据库连接配置和模型调用配置统一收进一个settings.json。适合正在做本地开发、测试环境联调手里有一张报表/日志/订单表需要按多个字段做 LIKE 匹配的同学。我会先给配置骨架再给可复制的查询代码最后跑一条验证动作打印命中行数和实际 SQL 参数确认多条件真的生效。顺带说一句很多同学在做这类脚本时会顺手接一个大模型来生成或解释 SQL这时候 Key 的管理就容易乱数据库密码一个地方、模型 Key 另一个地方。所以我把 TaoToken 的统一 Key 接入也放进同一份settings.json里让配置集中、代码干净。2. TaoToken 统一 Key 与 settings.json 配置骨架TaoToken 是一个统一的大模型 API 接入通道你可以在一个平台上拿到 Key然后按 OpenAI 兼容的方式调用不同模型。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。它的价值在于你不用为每个模型单独维护一套鉴权和地址一个 Key 走天下特别适合本地脚本里顺手调个模型的场景。先说清楚数据库连接和模型调用是两回事TaoToken 不碰你的 MySQL它只负责模型侧。把两者放同一份配置文件纯粹是为了工程上少维护几个文件、少几处硬编码。下面是我在本地项目里用的settings.json骨架放在项目根目录{ database: { host: 127.0.0.1, port: 3306, user: dev_user, password: dev_pass, charset: utf8mb4, database: report_db }, taotoken: { base_url: https://taotoken.net/api, api_key: sk-你的统一Key, default_model: gpt-4o-mini, timeout: 30 }, query: { table: report, like_fields: [field_a, field_b], batch_size: 500 } }几个要点解释一下。database段就是标准的 PyMySQL 连接参数charset一定写utf8mb4否则中文模糊匹配容易出乱码。taotoken段的base_url固定用https://taotoken.net/apiapi_key换成你在控制台生成的即可生成入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。query段是我特意抽出来的把表名和参与模糊匹配的字段列成数组后面拼 SQL 时直接遍历这个数组加字段只改配置不改代码。注意settings.json里含密码和 Key务必加进.gitignore别提交到仓库。本地可以再放一份settings.example.json作为模板。读取配置的代码很短import json def load_settings(pathsettings.json): with open(path, r, encodingutf-8) as f: return json.load(f) settings load_settings() db_conf settings[database] tk_conf settings[taotoken] q_conf settings[query]到这里配置层就绪。接下来是核心怎么把多个模糊条件变成安全的参数化 SQL。3. 多个 LIKE 条件的参数化拼接先明确目标给定一个关键词列表比如[Z001B191108002R100, 2024, 华东]要生成WHERE field_a LIKE %s AND field_b LIKE %s AND field_c LIKE %s这样的结构并且每个%s对应的参数是%关键词%。字段名从配置的like_fields里取参数值单独放进一个列表绝不拼进 SQL 字符串。def build_like_query(table, fields, keywords): table: 表名 fields: 参与模糊匹配的字段列表如 [field_a, field_b] keywords: 与 fields 一一对应的关键词列表 返回 (sql, params) if len(fields) ! len(keywords): raise ValueError(字段数与关键词数不一致) conditions [] params [] for field, kw in zip(fields, keywords): conditions.append(f{field} LIKE %s) params.append(f%{kw}%) where_clause AND .join(conditions) sql fSELECT * FROM {table} WHERE {where_clause} return sql, params调用一下看看sql, params build_like_query( q_conf[table], q_conf[like_fields], [Z001B191108002R100, 2024] ) print(sql) print(params)输出会是SELECT * FROM report WHERE field_a LIKE %s AND field_b LIKE %s [%Z001B191108002R100%, %2024%]注意这里字段名用了反引号包裹防止字段名和 MySQL 关键字冲突关键词统一加%前后缀实现包含语义。如果你想要前缀匹配把f%{kw}%改成f{kw}%就行这是个小但常用的开关。对比一下开头那段老代码老写法把con1、con2直接拼进 SQL字段名写死切片位置写死新写法字段来自配置、参数走占位符加一个条件只是往like_fields和keywords里各加一项。这就是工程化和能跑就行的区别。4. 执行查询并打印命中行数与 SQL 参数配置和拼接都好了现在把它接到真实连接上跑一遍。用 PyMySQLimport pymysql def run_query(sql, params): conn pymysql.connect( hostdb_conf[host], portdb_conf[port], userdb_conf[user], passworddb_conf[password], charsetdb_conf[charset], databasedb_conf[database], cursorclasspymysql.cursors.DictCursor, ) try: with conn.cursor() as cursor: cursor.execute(sql, params) rows cursor.fetchall() return rows finally: conn.close() if __name__ __main__: sql, params build_like_query( q_conf[table], q_conf[like_fields], [Z001B191108002R100, 2024] ) rows run_query(sql, params) print(命中行数:, len(rows)) print(SQL:, sql) print(参数:, params) for r in rows[:3]: print(r)cursorclassDictCursor让结果以字典返回字段名直接可读调试时比元组友好得多。cursor.execute(sql, params)是参数化执行的关键——PyMySQL 会把params安全地转义后填入%s你完全不用自己处理引号。跑起来后控制台应该打印类似命中行数: 17 SQL: SELECT * FROM report WHERE field_a LIKE %s AND field_b LIKE %s 参数: [%Z001B191108002R100%, %2024%]这条验证动作就是本篇的验收标准命中行数大于 0且参数列表里每个关键词都带上了%前后缀说明多个模糊条件正确生效。如果命中 0 行先别怀疑代码去数据库里手动SELECT COUNT(*)用同样的%关键词%试一下确认数据本身存在。如果你想让脚本更聪明一点比如把自然语言帮我查 field_a 包含 Z001 且 field_b 包含 2024 的记录转成上面的fields和keywords可以调一次模型。用 TaoToken 的话走 OpenAI 兼容接口from openai import OpenAI client OpenAI( base_urltk_conf[base_url], api_keytk_conf[api_key], timeouttk_conf[timeout], ) resp client.chat.completions.create( modeltk_conf[default_model], messages[ {role: system, content: 把用户查询意图拆成字段和关键词输出 JSON。}, {role: user, content: field_a 包含 Z001field_b 包含 2024}, ], ) print(resp.choices[0].message.content)这样模型只负责理解意图真正的 SQL 拼接和执行仍然由你的参数化代码完成职责清晰也安全。想直接在线试模型效果可以用 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。5. 本篇常见报错排查报错一pymysql.err.ProgrammingError: (1064, You have an error in your SQL syntax)八成是字段名撞了 MySQL 关键字比如字段叫order、group。解决办法就是上面代码里的反引号{field}别省。另一种可能是你手动拼了字符串某个关键词里带了单引号参数化能彻底避免这类问题。报错二TypeError: not all arguments converted during string formatting参数个数和%s占位符数量对不上。检查build_like_query里fields和keywords长度是否一致——我在函数开头加了ValueError校验就是为了提前拦住。如果你在 SQL 里还写了别的%s比如分页LIMIT %s记得把对应参数也 append 进params。报错三中文模糊匹配查不到结果先确认连接charset是utf8mb4再确认表和字段的排序规则collation不是latin1。可以用SHOW FULL COLUMNS FROM report;看字段的 Collation。如果表本身是 latin1中文 LIKE 基本没戏得改表结构。报错四pymysql.err.OperationalError: (2003, Cant connect to MySQL server)本地开发最常见的是 MySQL 没启动或者host写成了localhost但实际走的是 socket 而非 TCP。改成127.0.0.1通常能解决。端口不是默认 3306 的话检查settings.json里的port。报错五模型调用返回 401说明api_key不对或没带上。确认settings.json里填的是 TaoToken 控制台生成的 Key且base_url是https://taotoken.net/api注意结尾没有多余斜杠。Key 的生成和管理在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。6. 把配置和代码收进你的项目到这里一份能跑的多条件模糊查询骨架就齐了settings.json管配置build_like_query管拼接run_query管执行模型调用作为可选的意图解析层。加字段、改关键词、换表名都只动配置或调用参数不用再碰 SQL 字符串。如果你后续要把这套脚本接到更长期的编码任务或 Agent 流程里比如让模型自动生成查询、批量跑报表可以了解一下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 它更适合持续性的开发场景。接入细节和参数说明在文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后留个实用习惯每次改完like_fields先跑一遍打印sql和params的那两行肉眼确认占位符和参数一一对应再连数据库。这个动作花不了三秒但能省掉大部分为什么查不到的排查时间。
企业数字化 ERP 产品动态
相关推荐
医院网站和公众号建设方案落地最佳实践 医院网站和公众号建设方案落地最佳实践 改个挂号链接,建站公司拖了一周还没动静,急诊系统都要上线了,这谁受得了? 做医疗行业信息化,最怕的不是技术难,而是流程卡壳、响应慢。很多医院甲方对接人跟我吐槽,找外包团队做个医院网站和公众号建设方案,报… · 2026/9/27 15:29:46
网站建设核电行业建站避坑速查手册 网站建设核电行业建站避坑速查手册 自己不会代码想做网站,是不是看着后台代码就头大?别慌,我整理了这份网站建设核电行业的 速查手册… · 2026/9/27 15:29:46
5步搞定wordpress附件绕过媒体,新手避坑完整流程 5步搞定wordpress附件绕过媒体,新手避坑完整流程 域名解析和服务器配置是建站新手最大的拦路虎。很多刚接触WordPress的朋友,明明上传了图片,前台却显示不出,或者后台上传直接报错,根本搞不懂是域名没备案还是服务器权限没给对。… · 2026/9/27 16:26:01
gitnexus 的使用:用 MCP server 打通 node/npm 工作流并接入 TaoToken /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 16:25:55
网站建设技术哪些核心构成与建站报价避坑指南 网站建设技术哪些核心构成与建站报价避坑指南 域名买好了,服务器租了,结果打开浏览器一片空白,或者加载慢得让人想砸键盘。这种“域名服务器搞不懂”的挫败感,是无数初创团队和中小企业在官网建设初期最真实的噩梦。很多运营人员拿着手里那点可怜的预算,… · 2026/9/27 16:25:36
北京网站建设培训班揭秘:最佳实践让网站流量翻倍 北京网站建设培训班揭秘:最佳实践让网站流量翻倍 网站做好了没人访问,这大概是很多刚入行或想转行做前端的朋友最头疼的事。花了大半个月甚至几个月,吭哧吭哧把页面切完、功能调通,上线后打开后台一看,日UV(独立访客)个位数,甚至为0。这时候你才明… · 2026/9/27 16:25:36
wordpress装百度统计图解步骤:避开高价坑的实操指南 wordpress装百度统计图解步骤:避开高价坑的实操指南 找建站公司怕被坑高价?别急着掏钱,先看懂这篇wordpress装百度统计的图解步骤。很多老板为了省那几百块代码费,结果网站上线三个月,流量还是零,钱花得冤枉。… · 2026/9/27 16:25:30
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01