使用Python編寫一個SQL語句自動轉(zhuǎn)換工具(UPDATE到INSERT轉(zhuǎn)換)
引言
在日常數(shù)據(jù)庫維護和數(shù)據(jù)處理過程中,我們經(jīng)常需要將UPDATE語句轉(zhuǎn)換為INSERT語句,特別是在數(shù)據(jù)遷移、備份恢復或測試數(shù)據(jù)準備的場景中。手動轉(zhuǎn)換這些SQL語句不僅耗時耗力,還容易出錯。本文將介紹如何使用Python編寫一個自動化工具,實現(xiàn)UPDATE語句到INSERT語句的高效轉(zhuǎn)換。
問題背景
假設我們有一個包含大量UPDATE語句的SQL文件:
UPDATE `xxx_detail` SET `id`=1955445664111890432, `product_name`='xxx', `update_time`='2025-08-23 13:37:44' WHERE `id`=1955445664111890432; UPDATE `contracxxxt` SET `order_sn`='xxxxx', `total_amount`=1816485 WHERE `id`=1955445671208652800;
我們需要將這些語句轉(zhuǎn)換為INSERT語句:
INSERT INTO `xxx_detail` (`id`, `product_name`, `update_time`) VALUES (1955445664111890432, 'xxx', '2025-08-23 13:37:44');
INSERT INTO `contracxxxt` (`order_sn`, `total_amount`) VALUES ('xxxxx', 1816485);
解決方案設計
核心思路
- 使用正則表達式匹配UPDATE語句的結(jié)構(gòu)
- 提取表名、SET子句和WHERE條件
- 解析SET子句中的列名和值
- 構(gòu)建INSERT語句格式
關鍵技術(shù)點
- 正則表達式匹配
- 字符串處理
- 文件讀寫操作
- 錯誤處理機制
完整代碼實現(xiàn)
import re
import os
def update_to_insert(sql_content):
"""將UPDATE語句轉(zhuǎn)換為INSERT語句"""
# 正則表達式匹配UPDATE語句
update_pattern = r'UPDATE `(\w+)` SET (.+?) WHERE `id`=(\d+);'
matches = re.findall(update_pattern, sql_content, re.DOTALL)
insert_statements = []
for table_name, set_clause, id_value in matches:
# 解析SET子句
set_items = re.findall(r'`(\w+)`=([^,]+)(?:,|$)', set_clause)
# 構(gòu)建列名和值
columns = []
values = []
for column, value in set_items:
columns.append(f"`{column}`")
# 處理NULL值
value = value.strip()
if value.upper() == 'NULL':
values.append('NULL')
# 處理字符串值(用單引號括起來的)
elif re.match(r"^'.*'$", value):
# 去除外層單引號,然后重新添加正確的單引號
inner_value = value[1:-1] # 去掉外層單引號
# 轉(zhuǎn)義內(nèi)部單引號
escaped_value = inner_value.replace("'", "''")
values.append(f"'{escaped_value}'")
# 處理數(shù)字值
else:
values.append(value)
# 構(gòu)建INSERT語句
insert_sql = f"INSERT INTO `{table_name}` ({', '.join(columns)}) VALUES ({', '.join(values)});"
insert_statements.append(insert_sql)
return insert_statements
def process_sql_file(input_file, output_file):
"""處理SQL文件,將UPDATE轉(zhuǎn)換為INSERT"""
# 檢查輸入文件是否存在
if not os.path.exists(input_file):
print(f"錯誤:輸入文件 '{input_file}' 不存在")
return
try:
# 讀取輸入文件
with open(input_file, 'r', encoding='utf-8') as f:
sql_content = f.read()
# 轉(zhuǎn)換UPDATE語句
insert_statements = update_to_insert(sql_content)
# 寫入輸出文件
with open(output_file, 'w', encoding='utf-8') as f:
f.write("-- 由UPDATE語句生成的INSERT語句\n")
f.write("-- 生成時間: 2025-09-27\n")
f.write("-- 源文件: " + input_file + "\n")
f.write("=" * 80 + "\n\n")
for i, insert_stmt in enumerate(insert_statements, 1):
f.write(f"-- INSERT語句 {i}\n")
f.write(insert_stmt + "\n")
f.write("\n")
print(f"成功生成 {len(insert_statements)} 條INSERT語句")
print(f"輸出文件: {output_file}")
except Exception as e:
print(f"處理文件時出錯: {e}")
def main():
"""主函數(shù)"""
print("UPDATE語句轉(zhuǎn)INSERT語句工具")
print("=" * 40)
# 輸入文件路徑
input_file = input("請輸入包含UPDATE語句的文件路徑: ").strip()
# 輸出文件路徑(默認在輸入文件同目錄下)
if input_file:
base_name = os.path.splitext(input_file)[0]
output_file = f"{base_name}_insert.sql"
else:
output_file = "output_insert.sql"
# 確認輸出文件路徑
custom_output = input(f"請輸入輸出文件路徑 (默認: {output_file}): ").strip()
if custom_output:
output_file = custom_output
# 處理文件
process_sql_file(input_file, output_file)
# 示例使用(直接指定文件路徑)
if __name__ == "__main__":
# 方式1:交互式輸入
# main()
# 方式2:直接指定文件路徑
input_file = "./rollback_12681.sql" # 替換為你的文件路徑
output_file = "output_insert.sql"
process_sql_file(input_file, output_file)
代碼解析
1. 正則表達式匹配
update_pattern = r'UPDATE `(\w+)` SET (.+?) WHERE `id`=(\d+);'
這個正則表達式用于匹配UPDATE語句的三個關鍵部分:
(\w+):匹配表名(.+?):匹配SET子句內(nèi)容(\d+):匹配WHERE條件中的id值
2. SET子句解析
set_items = re.findall(r'`(\w+)`=([^,]+)(?:,|$)', set_clause)
這個正則表達式用于提取SET子句中的每個字段賦值對,匹配格式為:列名=值
3. 數(shù)據(jù)類型處理
代碼中特別處理了三種數(shù)據(jù)類型:
- NULL值:直接保留為NULL
- 字符串值:去除外層單引號并轉(zhuǎn)義內(nèi)部單引號
- 數(shù)字值:直接使用原值
4. 文件操作
使用with open()語句確保文件正確打開和關閉,支持UTF-8編碼以處理中文。
使用示例
交互式使用
運行腳本后按提示輸入文件路徑:
$ python update_to_insert.py UPDATE語句轉(zhuǎn)INSERT語句工具 ======================================== 請輸入包含UPDATE語句的文件路徑: ./rollback.sql 請輸入輸出文件路徑 (默認: ./rollback_insert.sql): 成功生成 25 條INSERT語句 輸出文件: ./rollback_insert.sql
直接指定文件
修改腳本底部代碼:
if __name__ == "__main__":
input_file = "./your_update_file.sql"
output_file = "./output_insert.sql"
process_sql_file(input_file, output_file)
處理效果對比
轉(zhuǎn)換前(UPDATE語句):
UPDATE `resource_detail` SET `id`=1955445664111890432, `product_name`='熱軋卷', `update_time`='2025-08-23 13:37:44' WHERE `id`=1955445664111890432;
轉(zhuǎn)換后(INSERT語句):
INSERT INTO `resource_detail` (`id`, `product_name`, `update_time`) VALUES (1955445664111890432, '熱軋卷', '2025-08-23 13:37:44');
擴展功能建議
- 支持更多WHERE條件:當前僅支持
id作為WHERE條件,可以擴展支持其他字段 - 批量處理:添加對目錄下多個SQL文件的批量處理功能
- 數(shù)據(jù)庫直連:添加直接連接數(shù)據(jù)庫執(zhí)行轉(zhuǎn)換后的INSERT語句
- 語法檢查:增加SQL語法驗證功能,確保生成的INSERT語句有效
- 進度顯示:添加進度條顯示處理進度
總結(jié)
本文介紹的Python腳本提供了一個高效、可靠的UPDATE到INSERT語句轉(zhuǎn)換解決方案。通過正則表達式和字符串處理技術(shù),實現(xiàn)了SQL語句的自動轉(zhuǎn)換,大大提高了數(shù)據(jù)庫維護和數(shù)據(jù)處理效率。這個工具不僅適用于文中提到的場景,還可以根據(jù)具體需求進行擴展和定制。
使用這個工具時,請注意備份原始數(shù)據(jù),并在測試環(huán)境中驗證轉(zhuǎn)換結(jié)果,確保數(shù)據(jù)準確性。
以上就是使用Python編寫一個SQL語句自動轉(zhuǎn)換工具(UPDATE到INSERT轉(zhuǎn)換)的詳細內(nèi)容,更多關于Python SQL語句自動轉(zhuǎn)換的資料請關注腳本之家其它相關文章!
相關文章
Python實現(xiàn)Microsoft Office自動化的幾種方式及對比詳解
辦公自動化是指利用現(xiàn)代化設備和技術(shù),代替辦公人員的部分手動或重復性業(yè)務活動,優(yōu)質(zhì)而高效地處理辦公事務,實現(xiàn)對信息的高效利用,進而提高生產(chǎn)率,實現(xiàn)輔助決策的目的,所以本文給大家介紹了Python實現(xiàn)Microsoft Office自動化的幾種方式,需要的朋友可以參考下2025-03-03
使用pyqt5 實現(xiàn)ComboBox的鼠標點擊觸發(fā)事件
這篇文章主要介紹了使用pyqt5 實現(xiàn)ComboBox的鼠標點擊觸發(fā)事件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
解決Python 爬蟲URL中存在中文或特殊符號無法請求的問題
今天小編就為大家分享一篇解決Python 爬蟲URL中存在中文或特殊符號無法請求的問題。這種問題,初學者應該都會遇到,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Tensorflow 定義變量,函數(shù),數(shù)值計算等名字的更新方式
今天小編就為大家分享一篇Tensorflow 定義變量,函數(shù),數(shù)值計算等名字的更新方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

