You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:48:23