社内SEの話

日々起きたことの記録用

PythonのORMでデータベース操作をやめた

↓プログラミングで副業を考えたらこちら↓

簡単いうと

学習コスト高すぎ。
覚えている時間があればプロジェクトを進めたい。

ORMとの出会い

Djangoチュートリアルで初めて出会いました。
当時はなんて素晴らしい概念なんだと感動したものです。
テーブル構成もコードで構築できるのでDDLを発行せずに、クラス登録した後にmigrateすればテーブルが作成される。
さらにSELECTやINSERTなどのDMLもクラスを使ってSQLを書かずにデータのやり取りをすることができる。
djangoでSELECTをする場合

orm = ORM.objects.all().values()
for data in orm:
    print(data.value)

簡単ですが、たった1行でデータ取得ができるのが感動しました。
複雑なデータ取得の場合は個別にSQLを書いてSQLを発行することができるので、簡単なデータはORMで。難しいデータはSQLでと2本立てで開発をすれば開発のスピードアップが図れると思いました。
事実Insertに限って言えば簡単でスピードは早くなりました。

ずっと調べてばっかじゃない?

検証がてら趣味なサービスを開発していくとどうしても躓く。
複雑なデータはSQLとしていたが、CountやSUMですら調べないと書き方がわかりませんでした。
さらにWHEREやGROUP、HAVINGをやろうとしたらORM文が長文になり、逆に可読性が下がりました。
副問合せやWindow関数などの複雑怪奇なデータは絶対にむりと悟り始めました。

さらにはDB固有のSQLを発行しようとしたときもORM側で対応しておらずSQLを直接指定するようになりました。
たとえばSQLiteのUPSERTみたいな文です。
UPSERTはUPSERTで便利なSQLなのでデータのコンバートには重宝します。
データがある時はUPDATE、なければISNERTを個別に作る必要がありました。
ORMで対応していればいいのに、、、

さらにORMのバグであったり、デバッガとの相性だったりと気にすることが多くなりました。

結局はSQL

悩んでいるなら、昔から書いているSQLを書いて開発のスピードを上げた方が何倍も効率的では無いだろうかと思い至りました。
趣味なサービス開発は振り出しに戻ってしまったが、へたに運用してデバッグに苦労するくらいならここで見切りをつけて可読性を上げた方がいいと判断しました。

まとめるとORMは便利だけど、同時に難しい。一つの言語を覚えるくらいの学習コストを考えたほうがいい。
しかも分かる人は作った人くらい。
自分はちょっとそれでは困る。

自分は結局SQLを手書きするレガシースタイルに戻りました。 慣れ親しんだSQLが一番だと思います。