Pythonコード中のSQL文インデントを考える
Pythonコード内にSQL文を書くときどうすれば良いのか、いまいち答えが探せなかったのでググって見た話。
ちなみに、今までは下記のような感じのコードを書いていた訳だが、これ見るからに分かりにくい。
# コード例その1 cur.execute(""" create table count ( sid text, count int);""") # コード例その2 try: cur.execute("""insert into count ( sid, count ) values ( :sid, :count );""", d) except sqlite3.IntegrityError: cur.execute("""update count set sid = :sid, count = : count where sid = :sid;""", d) # コード例その3 cmd = """select sid, title, date from stories where date >= ? and date < ? and sid in ( select sid from topics where topic == ? and sid in ( select sid from topics where topic == ? )) order by date """ cur.execute(cmd, (begin_t, end_t, t1, t2))
「SQL インデント」でググると、そういう話のネタが一杯出てくるでてくる。その中から拾ってみたのが下記。
- SQLプログラミング作法
- SQL のコーディングスタイル(インデント) - 集中力なら売り切れたよ
- SQL文をきれいにフォーマットしてくれる『SQL in Form』 - POP*POP ~ 世界のニュースをクオリティ重視で
- VB.NETで作る! | SQL文の字下げ目安
- SQLの整形ツール~整形結果の例 - プログラマー’sペイジ
異端だけど、俺的コーディングルール SQL編 – suVeneのアレというのも参考になった。
で、この辺をまとめたところ、だいたい以下のようなルールに落ち着いた。
- SQLキーワードは大文字で
- 括弧挟まれた部分はインデントレベルを+1する
- カンマ、ANDの直後で改行
- カンマやANDでつなげられている部分はなるべくキーワード部分でそろえる
このルールで書いたコードは下記のような感じ。
# コード例その1 cur.execute(""" CREATE TABLE count ( sid text, count int ); """) # コード例その2 try: cur.execute(""" INSERT INTO count ( sid, count ) VALUES ( :sid, :count ) """, d) except sqlite3.IntegrityError: cur.execute(""" UPDATE count SET sid = :sid, count = : count WHERE sid = :sid """, d) # コード例その3 cmd = """ SELECT sid, title, date FROM stories WHERE date >= ? AND date < ? AND sid IN ( SELECT sid FROM topics WHERE topic == ? AND sid IN ( SELECT sid FROM topics WHERE topic == ? ) ) ORDER BY DATE """ cur.execute(cmd, (begin_t, end_t, t1, t2))
本当にこれで良いのかはまだ自信がないが、おおむね間違ってはいないと思う。ていうかコード内にSQL文を直書きせずO/Rマッパー使え、という話もあるが……。