1. ホーム
  2. python

[解決済み] Python SQL クエリ文字列の書式設定

2022-08-18 12:55:12

質問

SQLクエリ文字列をフォーマットする最良の方法を見つけようとしています。私がデバッグしているとき アプリケーションをデバッグしているとき、私はすべてのSQLクエリ文字列をファイルに記録したいと思います。 文字列が適切にフォーマットされていることが重要です。

オプション1

def myquery():
    sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
    con = mymodule.get_connection()
    ...

  • これは、SQL文字列を表示するのに適しています。
  • 文字列が長く、標準の幅に収まらない場合は、良い解決策ではありません。 に収まらない場合は良い解決策ではありません。

オプション2

def query():
    sql = """
        select field1, field2, field3, field4
        from table
        where condition1=1
        and condition2=2"""
    con = mymodule.get_connection()
    ...

  • ここではコードは明確ですが、SQLクエリ文字列を印刷すると、これらの迷惑な空白がすべて表示されます。

    u'\nselect field1, field2, field3, field4n_. ___ from tablen ___ where condition1=1 \n ___ _and条件2=2'

注:空白をアンダースコアに置き換えています。 _ に置き換えています。これは、エディタによってトリミングされるためです。

オプション3

def query():
    sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
    con = mymodule.get_connection()
    ...

  • このオプションは、よく表わされたコードの明確さを壊すので、好きではありません。

オプション 4

def query():
    sql = "select field1, field2, field3, field4 " \
          "from table " \
          "where condition1=1 " \
          "and condition2=2 "
    con = mymodule.get_connection()    
    ...

  • 私はこのオプションが好きではありません。 また、クエリを編集するのも難しいからです。

私にとっての最良の解決策は オプション 2 ですが、SQL文字列を印刷するときに余分な空白があるのは好きではありません。

他の選択肢をご存知ですか?

どのように解決するのですか?

こんな古いスレッドに投稿してすみません -- しかし、同じくパイソン的な「ベスト」への情熱を共有する者として、私たちの解決策を共有しようと思いました。

解決策は、python の String Literal Concatenation ( http://docs.python.org/ ) を使って SQL 文を構築することです。これは選択肢 2 と選択肢 4 の間のどこかに当てはまります。

コードサンプルです。

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

と同様に f-文字列 :

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 の 'well tabulated' フォーマットを保持しますが、余計なスペース文字を追加しません (これはロギングを汚染します)。
  2. オプション 4 のバックスラッシュの継続の醜さを回避し、ステートメントを追加することを困難にします (言うまでもなく、ホワイトスペースの盲点です)。
  3. そしてさらに、VIM でステートメントを展開するのは本当に簡単です (単に挿入ポイントにカーソルを置いて SHIFT-O を押して新しい行を開きます)。