Elevator Pitch
DjangoのORMはとても便利です。しかし、SQLならすぐに書ける「サブクエリをINNER JOINする」「1つのテーブルを2回OUTER JOINする」といったクエリをDjango ORMで表現するのは苦手です。生のSQLを書いてDjangoで実行する方法もありますが、動的にSQLを組み替えるのが難しくなったりSQL Injectionのリスクもあるためお勧めできません。SQLAlchemyを使えば、この問題を解決できます。このトークでは、SQLAlchemyでSQLの組み立てる方法と、Django上で安全に実行する方法について紹介します。
Description
DjangoのORMはとても便利ですが、少し複雑なクエリを組み立てようとすると急に難しくなってしまうことがあります。例えば、サブクエリの結果をINNER JOINしたい場合や、1つのテーブルを2回OUTER JOINしたい場合などは、SQLならすぐに書けるのにDjango ORMで表現するのがとても難しかったり、不可能だったりします。このような場合にSQLを直接書いて Model.objects.raw()
や execute()
で実行する方法もありますが、この方法では動的にSQLを組み替えるのが難しくなったりSQL Injectionのリスクもあります。
このトークでは、SQLAlchemyをSQL表現言語として使う事でSQLの組み立てをプログラムで行い、Django上で安全に実行する方法を紹介します。
アジェンダ
- Django ORMで表現が難しいSQLの例
- SQLを直接書いてrawやexecuteで実行する例と問題点
- SQLAlchemyの紹介と簡単な実行例
- 複雑なSQLをSQLAlchemyで組み立てる
- SQLAlchemyとDjangoの連携