[解決済み] 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};")
長所
- pythonic の 'well tabulated' フォーマットを保持しますが、余計なスペース文字を追加しません (これはロギングを汚染します)。
- オプション 4 のバックスラッシュの継続の醜さを回避し、ステートメントを追加することを困難にします (言うまでもなく、ホワイトスペースの盲点です)。
- そしてさらに、VIM でステートメントを展開するのは本当に簡単です (単に挿入ポイントにカーソルを置いて SHIFT-O を押して新しい行を開きます)。
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] Pythonで文字列を小文字にするには?
-
[解決済み] 文字列フォーマット:% vs. .format vs. f-stringリテラル
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pythonのインスタンス変数とクラス変数
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] Pythonの辞書にあるスレッドセーフについて