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

Python中SQL语句格式化问题:输出缩进异常如何解决?

解决Python中SQL多行字符串格式化的缩进问题

哦,这个问题我之前也碰到过!本质是Python的三重引号多行字符串会完全保留你在代码里手动添加的缩进空格/制表位,所以你写在SELECT、FROM这些行前面的缩进,会直接出现在最终生成的SQL语句里,导致打印时它们向右偏移。下面给你几个实用的解决思路:

1. 手动控制换行(无多余缩进)

如果SQL语句不算特别长,可以用换行符\n来拆分行,同时确保每一行开头没有多余缩进:

sql_statement = "INSERT INTO {target}.{table} \nSELECT COL1,COL2 \nFROM {src}.{table} \nWHERE Id = 999".format(
    table=table, 
    src=src, 
    target=target
)
cur.execute(sql_statement)

这种方式简单直接,输出的SQL每一行都会顶格显示。

2. 使用textwrap.dedent自动去除公共缩进

如果想保持代码里的缩进美观(符合Python的PEP8规范),又不想让缩进出现在SQL里,可以用标准库的textwrap.dedent方法,它会自动移除多行字符串中所有行的公共前缀缩进:

import textwrap

# 这里代码里的缩进会被dedent自动去掉
sql_statement = textwrap.dedent("""
    INSERT INTO {target}.{table}
    SELECT COL1,COL2
    FROM {src}.{table}
    WHERE Id = 999
""").format(table=table, src=src, target=target).strip()
cur.execute(sql_statement)
  • dedent负责去掉所有行的公共缩进,让SQL语句干净整洁
  • 最后加.strip()是为了去掉三重引号开头换行带来的空行

3. 结合f-string简化写法(Python3.6+)

如果你的Python版本支持f-string,写法可以更简洁,同样搭配textwrap.dedent:

import textwrap

sql_statement = textwrap.dedent(f"""
    INSERT INTO {target}.{table}
    SELECT COL1,COL2
    FROM {src}.{table}
    WHERE Id = 999
""").strip()
cur.execute(sql_statement)

为什么把INSERT放第一行开头就正常?

因为当你把INSERT直接写在三重引号的第一行开头时,后面的行如果没有手动加缩进,自然就不会有多余的空格/制表位。但一旦为了代码美观给后面的行加了缩进,这些缩进就会被字符串保留下来,这就是问题的根源啦。

内容的提问来源于stack exchange,提问作者Anthony Potter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:12:40