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
相关产品推荐
相关产品推荐

