Python执行SQL查询出现Unexpected unindent缩进错误解决方法
问题描述
编写Python脚本通过mysql.connector连接数据库执行本地SQL文件时,运行抛出unexpected unindent(意外反缩进)报错,多次手动调整缩进后问题仍未解决。
原问题代码如下:
import mysql.connector cnx = mysql.connector.connect(user='skynetadmin', password='Skynetadmin1', host='silmysskytest01.sing.micron.com', database='skynet_msa') cursor =cnx.cursor() def executeScriptsFromFile(filename): fd = open(filename, 'r') sqlFile = fd.read() fd.close() sqlCommands = sqlFile.split(';') for command in sqlCommands: try: if command.strip() != '': cursor.execute(command) executeScriptsFromFile('C:\Users\gsumarlin\Documents\dumps\Dump20220428\Query_for_testingintern.sql') cnx.commit()
运行时抛出的报错信息:
executeScriptsFromFile('C:\Users\gsumarlin\Documents\dumps\Dump20220428') ^ unexpected unindent
问题原因
代码存在3个核心问题,直接触发缩进报错和后续运行风险:
- 函数作用域缩进错误:
executeScriptsFromFile函数内拆分完SQL语句列表后,遍历执行SQL的for循环代码块没有缩进放入函数体内,和函数定义处于同一缩进层级,而sqlCommands是函数内部的局部变量,外部无法访问,缩进层级逻辑混乱直接触发unexpected unindent语法错误 - 语法结构缺失:代码中写了
try块但没有配套的except或finally分支,本身不符合Python语法规范,也会触发语法报错 - 路径转义隐患:Windows路径直接使用反斜杠
\编写,会被Python识别为转义字符,就算修复缩进问题也会出现文件找不到的报错
修复后可运行代码
import mysql.connector # 建立数据库连接 cnx = mysql.connector.connect( user='skynetadmin', password='Skynetadmin1', host='silmysskytest01.sing.micron.com', database='skynet_msa' ) cursor = cnx.cursor() def executeScriptsFromFile(filename): # 读取SQL文件,指定编码避免乱码 with open(filename, 'r', encoding='utf-8') as fd: sqlFile = fd.read() # 按分号拆分单条SQL语句 sqlCommands = sqlFile.split(';') # 遍历执行所有SQL,该块必须缩进放在函数内部 for command in sqlCommands: try: stripped_cmd = command.strip() if stripped_cmd: cursor.execute(stripped_cmd) except Exception as e: print(f"SQL执行异常:{str(e)},异常语句:{command}") # 若需要遇到错误立即终止,放开下面的注释即可 # raise e # 路径前加r标记为原始字符串,避免反斜杠被识别为转义符 executeScriptsFromFile(r'C:\Users\gsumarlin\Documents\dumps\Dump20220428\Query_for_testingintern.sql') cnx.commit() # 释放数据库连接资源 cursor.close() cnx.close()
关键修复点说明
- 调整
for循环及内部代码的缩进,统一放入executeScriptsFromFile函数作用域内,解决缩进层级混乱问题 - 为
try块补充异常捕获逻辑,符合Python语法要求,同时支持打印出错的SQL语句方便排查问题 - 本地文件路径前添加
r前缀标记为原始字符串,规避反斜杠转义导致的路径识别错误 - 改用
with语法处理文件读取,自动完成文件关闭,避免文件资源泄漏;补充游标、数据库连接的关闭逻辑,优化资源释放 - 读取文件时指定
utf-8编码,避免不同系统默认编码不一致导致的文件读取乱码问题
内容的提问来源于stack exchange,提问作者Gracella Q Sumarlin
相关产品推荐
相关产品推荐

