用 re.findall 匹配带下划线的表名最稳,因其不依赖位置且不因失败中断;应使用 r'table_[\w-]+' 并结合去重、分块处理、注释过滤及 information_schema 校验确保准确。
用 re.findall 匹配带下划线的表名最稳
直接用 re.findall 比 re.search 或 re.match 更适合批量提取——它不依赖位置,也不因匹配失败中断流程。常见错误是写成 ^table_\w+,结果漏掉中间有数字或横线的表(比如 table_user_v2 或 table_log_2024-01)。
实操建议:
- 用
table_[\w-]+覆盖字母、数字、下划线、短横线,比\w+更安全 - 加
r''原始字符串,避免反斜杠被转义(比如误写成table_\d+反而匹配不到数字) - 如果表名固定前缀但后缀含大小写(如
Table_Report),加re.IGNORECASE标志 - 导出前先用
set()去重,防止同名表被重复处理
导出 SQL 时别让正则吃掉换行和注释
从完整 SQL 文件里抽表结构,容易把 CREATE TABLE table_log ( 后面的字段定义也当表名匹配进来,尤其当多行定义混着 -- 注释时。
实操建议:
- 先用
re.split(r';\s*\n', sql_content)拆语句块,再对每块单独匹配,比通篇扫更可控 - 过滤掉注释行:
line.strip().startswith('--')或line.strip().startswith('#'),避免误判 - 如果表名在
FROM或JOIN后,注意空格和换行干扰,用\s+替代固定空格,比如r'FROM\s+([a-zA-Z_][\w-]*)'
MySQL 的 information_schema 导出比正则更可靠
正则匹配文本是“碰运气”,而查 information_schema.tables 是查真实元数据——尤其当表名含反引号、大小写敏感、或来自不同 schema 时,正则极易漏或错。
实操建议:
- 用
SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_db' AND table_name LIKE 'table_%';直接捞出目标表 - 如果需要导出结构+数据,优先用
mysqldump --no-create-info --tables db_name table1 table2,传参比拼正则更准 - 注意 MySQL 8.0 默认大小写敏感,
table_LOG和table_log是两个表,LIKE 不会自动忽略大小写
Python 批量导出时,subprocess.run 比 os.system 容错强
用 os.system 调 mysqldump 一旦参数含空格或特殊字符(比如密码里有 $ 或 !),命令就静默失败;而 subprocess.run 能捕获 stderr 并判断返回码。
实操建议:
- 把命令拆成列表传入:
subprocess.run(['mysqldump', '-u', user, '-p'+pwd, 'db', 'table_name'], capture_output=True, text=True) - 检查
result.returncode != 0,并打印result.stderr,否则导出空文件都不知道哪错了 - 不要把密码拼进字符串,MySQL 会警告甚至拒绝连接;改用配置文件或
--defaults-extra-file
正则能快速筛,但数据库元数据才是唯一真相;真正上线跑批量导出时,多一层 information_schema 校验,比调十次正则都省心。











