
本文介绍使用正则表达式精准移除 MariaDB 导出 SQL 中不兼容 SQLite 的 PRIMARY KEY、FOREIGN KEY 等约束子句,适用于处理大体积(如 3GB)SQL 文件,兼顾准确性与内存效率。
本文介绍使用正则表达式精准移除 mariadb 导出 sql 中不兼容 sqlite 的 `primary key`、`foreign key` 等约束子句,适用于处理大体积(如 3gb)sql 文件,兼顾准确性与内存效率。
在将 MariaDB 导出的大型 SQL 文件(例如 3GB)迁移到 SQLite 时,一个常见障碍是 SQLite 不支持 PRIMARY KEY(...) 或 FOREIGN KEY(...) 这类列级或表级约束语法(尤其是带括号参数的显式 Key 声明)。直接用字符串替换或简单正则易误删合法内容(如字段名含 key),因此需设计语义感知型正则模式,精准匹配以 Key( 开头、以 ) 结尾、且位于建表语句内的约束片段。
以下推荐方案采用 re.sub() 配合多分支正则,可安全清除各类 Key 约束并自动处理逗号分隔与换行空白:
import re
def remove_key_constraints(sql_content: str) -> str:
"""
移除 SQL 字符串中所有形如 'PRIMARY KEY(...)'、'FOREIGN KEY(...)' 的约束子句,
同时自动清理前导逗号、多余空白及换行,保持 SQL 结构整洁。
"""
# 匹配模式说明:
# - \s*[,;]?\s* :匹配前置可选逗号/分号及空白(用于删除后避免残留逗号)
# - \b(?:PRIMARY|FOREIGN|UNIQUE)\s+KEY\s*\([^)]*\) :匹配关键词 + KEY + 括号内任意非右括号内容
# - \s*(?:,|;|\)|\n|$) :匹配约束后紧跟的分隔符(逗号、分号、右括号、换行或行尾)
pattern = r'\s*[,;]?\s*\b(?:PRIMARY|FOREIGN|UNIQUE)\s+KEY\s*\([^)]*\)\s*(?:,|;|\)|\n|$)'
# 替换为空字符串,并多次迭代确保嵌套/连续约束被清除(re.sub 默认全局)
cleaned = re.sub(pattern, '', sql_content, flags=re.IGNORECASE | re.MULTILINE)
# 可选:进一步压缩连续空白(提升可读性,非必需)
cleaned = re.sub(r',\s*\)', ')', cleaned) # 清理形如 ',)' 的残留
cleaned = re.sub(r'\n\s*\n', '\n\n', cleaned) # 合并空行
return cleaned
# 示例使用
input_sql = """CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255),
Primary Key(`PersonID`),
Foreign Key(`City`)
);"""
output_sql = remove_key_constraints(input_sql)
print(output_sql)输出效果:
CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) );
✅ 关键优势与注意事项:
立即学习“Python免费学习笔记(深入)”;
- 精准匹配:\b 确保 Key 是独立单词(避免误删 apikey 或 keyword);[^)]* 限定括号内无嵌套,防止跨行误匹配;
- 大小写不敏感:re.IGNORECASE 兼容 PRIMARY KEY / primary key 等变体;
- 大文件友好:对 3GB 文件,建议流式处理而非一次性读入内存——可用 mmap 或逐行/块读取(注意约束可能跨行,需缓冲上下文);
- 安全兜底:操作前务必备份原始文件;对生产数据,先用小样本验证正则逻辑;
- 扩展性:如需同时移除 INDEX、ENGINE= 等 MySQL 特有语法,可扩展正则或叠加 re.sub() 调用。
⚠️ 提示:若 SQL 文件中存在注释(如 -- PRIMARY KEY(id))或字符串字面量(如 'some key value'),上述正则可能误匹配。此时需改用 SQL 解析器(如 sqlparse)进行语法树分析,但会显著增加复杂度与开销。对于纯迁移场景,本正则方案在准确率与性能间取得了最佳平衡。










