Pythonで、変数を挿入して柔軟にSQLクエリを構築する

データ処理のタスクをこなしていると、PythonでSQLに変数を挿入し柔軟にSQLクエリを構築したくなる。 例えば、 中間テーブルを作るためにAirFlowなどで定期的なジョブを実行し、SQLの createdの時間を当日のものに変更する training, dev, test でデータを分割する際に、createdの条件を変更して3パターンのデータを取得する などが考えられる。 変数をSQLに組み込んで実行したい際には、kayak/pypikaのような SQL builder もあるが、個人的に可読性が悪くなったり、SQLクエリの作成のためだけに余計なパッケージをいれたくない。そのためパッケージを入れずにシンプルに完結する方法をここでは紹介する。 編集履歴 2021/05/12: twitter でdocstring ではなくstring literal ですよという指摘をいただき修正 ref 2021/05/12: twitter での意見を反映 1. 単なる文字列としてSQLクエリを構築 1 2 3 def get_guery(num: int, category: str): sql=f"SELECT field1, field2, field3, field4 FROM TABLE WHERE condition1={num} AND condition2={category}" return sql f-string で文字列に変数を挿入して、SQLクエリを構築 だが、 SQLが長くなるとPEP8に準拠せず、E501 line too longに抵触する 視認性が低く、SQLクエリの実行内容を理解しづらい 2. 複数行文字列としてSQLクエリを構築 1 2 3 4 5 6 7 8 def get_guery(num: int, category: str): sql = f""" SELECT field1, field2, field3, field4 FROM table WHERE condition1={num} AND condition2={category} """ return sql 1番目と比較すると、複数行を扱えるstring literal-longstringを採用することで、SQLクエリが複数行になることでで見やすい (@cocu_tan さん、ご指摘ありがとうございます!...

April 29, 2021 Â· Shunya Ueta