我试图找到格式化sql查询字符串的最佳方法.当我调试的时候

Option 1

def myquery():
    sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
    con = mymodule.get_connection()
    ...
  • 这适用于打印sql字符串.
  • 如果绳子很长且不符合标准宽度,这不是一个好的解决方案

Option 2

def query():
    sql = """
        select field1, field2, field3, field4
        from table
        where condition1=1
        and condition2=2"""
    con = mymodule.get_connection()
    ...
  • 这里的代码很清楚,但是当你打印sql查询字符串时,你会得到这些恼人的空格.

    u'\n Select 字段1、字段2、字段3、字段4\n_____from table\n____where condition1=1 \n_____和条件2=2'

Note: I have replaced white spaces with underscore 100, because they are trimmed by the editor

Option 3

def query():
    sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
    con = mymodule.get_connection()
    ...
  • 我不喜欢这个选项,因为它 destruct 了列表良好的代码的清晰性.

Option 4

def query():
    sql = "select field1, field2, field3, field4 " \
          "from table " \
          "where condition1=1 " \
          "and condition2=2 "
    con = mymodule.get_connection()    
    ...
  • 我不喜欢这个选项,因为每行都有额外的输入

对我来说,最好的解决方案是Option 2,但我不喜欢打印sql字符串时额外的空格.

你知道还有其他 Select 吗?

推荐答案

很抱歉发布到这样一个老帖子上——但作为一个同样热衷于Python"best"的人,我想我应该分享一下我们的解决方案.

解决方案是使用python的字符串文字连接(http://docs.python.org/)构建SQL语句,它可以限定在选项2和选项4之间的某个位置

代码示例:

sql = ("SELECT field1, field2, field3, field4 "
       "FROM table "
       "WHERE condition1=1 "
       "AND condition2=2;")

适用于f-strings:

fields = "field1, field2, field3, field4"
table = "table"
conditions = "condition1=1 AND condition2=2"

sql = (f"SELECT {fields} "
       f"FROM {table} "
       f"WHERE {conditions};")

赞成的意见:

  1. 它保留了pythonic的"良好列表"格式,但没有添加额外的空格字符(这会污染日志(log)记录).
  2. 它避免了选项4的反斜杠延续丑陋,这使得添加语句变得困难(更不用说空白盲).
  3. 此外,在VIM中展开语句非常简单(只需将光标定位到插入点,然后按SHIFT-O键打开新行).

Sql相关问答推荐

SQL查询:合并2个表

Lag()函数的差异:R与SQL(将R代码转换为SQL)

如何在presto/SQL中使用两个数组列创建(分解)单独的行

基于多列比较连接两个表

两个不同星期的销售额,不加成一行

如何将`now()`作为SQL插入语句的一部分?

关于Postgres横向联接的谓词

从结果SQL查询中排除空值

多条件SQL排序行为

在Power Bi中将SQL代码转换为DAX

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

从JSON值数组创建扁平数组Athena

连续天跟踪购买情况(将标记返回到另一列?)

使用多个数据库调用重载 CQRS 模式

在 Oracle 21c 中透视文本值

使用长 IN 子句的 SQL 优化

每次计数器增加时通过运行总重置进行分组

Select 多年的日期范围

如何仅在满足条件时才按顺序在 SQL 中计数?

SQLite 中的过滤运行总和视图