めもちょー

メモ帳代わりに使っています。

アプリケーションからSQLを実行する際の注意点

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