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
を使うべきだろう。