PythonなどのアプリケーションからSQLを実行する際のポイントを個人的にまとめてみました。
Python関数よりもSQL関数
基本的にPythonの速度はSQLの速度と比べて非常に遅いため, SQLで実行できるものはSQLで実行するのが望ましい。
また、SQL関数を使うことでDBから返される結果が小さくなり通信速度が上がり、メモリの量も節約することができる。
NG
len(sql("SELECT * FROM tbl;"))
OK
sql("SELECT COUNT(1) FROM tbl;")
bulk
1000回のSQLを発行するよりも1回のSQLを発行すべきである。
Pythonの処理がSQLに比べて非常に遅いためと、SQLを発行するたびにDBと通信を行うため、SQL発行回数を抑えることで通信回数を減らすことができるから。
NG
for _ in range(1000): sql(f"INSERT INTO tbl (id, name) VALUES ({id}, {name});")
OK
sql("BULK INSERT tbl FROM file;")
エラー処理
「SELECTして目的のものが無かったらINSERT」ではなく「INSERTしてみて、もし目的のものが既にあったらエラーでpass」という処理をすべき。
理由は、SQLの発行回数が減らせるためである。
NG
if not sql(f"SELECT 1 FROM tbl WHERE id={id}"): sql("INSERT INTO tbl (id, name) VALUES ({id}, {name});")
OK
try: sql("INSERT INTO tbl (id, name) VALUES ({id}, {name});") except UniqueviolationError as e: pass