mizzsugar’s blog

日々感じていることや学んだことを書きます。エンジニアリング以外にも書くかもしれません。

SQLAlchemy2.0でPostgreSQLを使うメモ

SQLAlchemy2.0でPostgreSQLを動かす際、driverどれにするか迷ったのでメモ。

結論

その時はasync使う必要がなかったのでpsycopgにした。FastAPIなどasyncをモリモリ使う場合はasyncpgにするとDB接続以外のところでasync使って速度出そうとしているのをうまく活かせそう。

ORMでのBULK INSERTの最適化

SQLAlchemy2.0ではほとんどのdriverでBULK INSERT + RETURNING(executemany() + RETURNING)の最適化が施された。executemany()の最適化は1.4でpsycopg2に対して最適化されたもので、他のdriverにも適用されるようになった。1.4のpsycopg2ではexecutemany()のみの最適化だったが、2.0の他のdriver にはexecutemany()だけでなくその後のRETURNINGも含めた最適化が施された。

psycopg

pysycopg3とも言えるが、psycopgが正式名称。(psycopgのバージョン2はpsycopg2、psycopgのバージョン3はpsycopgというなんともややこしい…)

ベンチマークをみると、BULK INSERT後のRETURNINGがかなり改善されたことがわかる。 https://docs.sqlalchemy.org/en/20/changelog/whatsnew_20.html#benchmarks

psycopg2

BULK INSERとRETURNINGのベンチマークに1.4と2.0で差がない。SQLAlchemy1.4でexecutemany()の高速化がすでに実装されたので、BULK INSERT後のRETURNINGのサポートをしないそう。

asyncpg

こちらもpsycopgと同様、かなり改善された。BULK INSERTとは関係ないが、asyncpgを呼び出す側にevent loopなどasyncの仕組みを実装しないといけないのが面倒。FastAPIなどasyncが標準の仕組みにのせるならasyncpgを使うべきだろう。