絵描きエンジニアの日常スマートフォン用の表示で見る絵描きエンジニアの日常この広告は、90日以上更新していないブログに表示しています。2018-09-29Doma2環境の中間テーブルを考えるDoma2環境でレコードを削除するときに中間テーブルをどう扱うか悩んだのでそのメモ。上のようなテーブルで、repositoriesのレコードを削除するときのことを考える。repositoriesにはlanguages、frameworksの間に中間テーブルが存在していて、一緒に削除しないと外部キー制約に引っかかってエラーになる。repositoriesを削除する前にこの中間テーブルを削除しなければならないが、Doma2ではsqlファイルに複数のSQL文を書くことができないので何かしらの方法を考える必要がある。CASCADEをつけてrepositoriesのレコードを削除したときに一緒に削除できるようにする。DB側で頑張るのでアプリケーションコードがすっきりする。Dのように伝播が広がりすぎると手がつけられなくなる可能性がある。この辺は経験不足なのでどうなるかわからない。アプリケーションコードで頑張る中間テーブルのDaoを作ってアプリケーションコードで削除するようにする。アプリケーションコードがつらくなる。メリットとしてはDBのマイグレーションよりはアプリケーションコードのほうが変更が容易であること。JOINして削除する[ボツ]これは試してボツになった案。調べてみて知ったが、joinして複数のテーブルをまとめて削除できるらしい。以下のようなSQL1発で解決できると思ったが外部キー制約に引っかかってダメだったのでボツ。/*repo.id*/2カスケードを使うことにしたアプリケーションコードがシンプルになる・カスケードに関してはテストである程度担保できるという理由で選択。カスケードの伝播が広がりすぎて手がつけられなくなりそうになったら撤退する予定。20:33Doma2環境の中間テーブルを考えるTweet広告を非表示にするもっと読むコメントを書く2018-09-26最近の悩み最近エンジニアとしての生き方にもやっと悩んだりしているので文章にして整理してみようと思った。今はtoCのサービスをRailsで書いている。Java好きじゃなくなったかというとそういうわけでもなく、toCやりたいなーと思っていたら成り行きでそうなった感じ。学びがなかったかというとそんなことはなくて異文化に触れることでいろいろ学ぶことはあったけど、RubyやRailsを学ぶことに対して熱量が持てていないのが現状。実際趣味でRubyやRailsを触ってないしね。toCを作ることの面白さみたいなのはあってユーザーが良い反応してくれると嬉しいし新しいものをリリースする楽しさはとてもある。Javaが好き今でも趣味でJavaを書いていて、Java11がリリースされるのもワクワクしていたし楽しみにしてた。趣味でコードを書くときはJavaしか書かないし、仕事でどうでもいい使い捨てのコードを書くときも無駄にJavaで書いたりしている(きっとRubyで書いたほうが早い)。学生のときほどではないけど今でもJavaの情報は追っているつもり。CCCとかJavaの勉強会で登壇するネタが出せない現状がすごくつらい。Rubyの勉強会のネタはあるのにね...やっぱり業務で触ってないと難しいんだと思う。今の悩み多分だけど、いつか転職するときはJavaが書けるところに行くんだろうなと思っているけど実務経験もなくRailsを書いていた人間がJavaの会社に行けるか不安だし、toCかつJavaという選択肢はすごく狭くてどちらか捨てないといけなくなるとも思っている。どっちも好きだし選ぶのって難しいなー...。エンジニアとして成長するなら多分Javaの会社に行くことだと思っていて、得意な言語を伸ばしていきたい。最近Twitterやってると他のエンジニアとどんどん差ができているような気持ちになってるし危機感。ちなみに今の仕事に不満があるわけではなくJavaが書けない以外は最高の職場と業務内容です。最近Tuzigiriというリポジトリを作ったりしてる。このリポジトリは、GitHubのリポジトリシェアのサービスをオープンソースで作りつつ、色んな人にSpringBootのお手本や参考にしてもらえばいいかなというモチベーションで作っている。このへんのお気持ちはまぁおいおい別記事で書こうと思う。いまはnoko_kと一緒に走り始めた段階だが、とあるプルリクエストでDoma2の使い方について議論になったのでそのへんのことを書こうと思う。ワイルドカードというアンチパターン雑にワイルドカードでカラム指定をしているSQLでnokoによってお縄になった。これはSQLアンチパターンのインプリシットカラム(暗黙の列)というものらしい。(最近SQLアンチパターンを買ったのに積んであって申し訳ない...)積んであったSQLアンチパターンを読んでみると以下のようなデメリットが書かれていた。Doma2の場合は影響なさそう。生JDBCのResultSet#getString(columnIndex)のようなケースだと踏んでしまうケースですね。それほど大量のカラム持ってないし気にするほどか?という気持ちもある。書くことで、マッピングするEntityのカラムを自動的に展開してくれる機能がある。これを使って回避すると良いっぽそう。Domaは特別に設定を書かなかった場合デフォルトでマッピングできないカラムがあったときに例外をスローするのでワイルドカードは危ない。SQLアンチパターンになかった指摘としてカラムの型変換をしたときに明示的に書くことでgrepしやすいというものもあった。これはexpandでは満たせない要求なので難しい。するのが良いのかワイルドカードを使わずにカラム指定を使ったほうが良いのは確かになったが、expandか明示的にカラムを書くか考える必要がある。結論としては以下の理由でexpandを使う方針になった。明示的にカラムを書いていた場合、新しいDBにカラムが追加されたときに複数のsqlファイルを変更する必要があり漏れて例外になる可能性がある。expandの場合マッピングする型の修正のみで済む。expandのほうが楽なのと、Domaに乗っかっている感じがある。探り探りやっているのでこれが普通かどうかはまだ自信がない。22:46ふつうのDoma2の使い方Tweet広告を非表示にするもっと読むコメントを書く2018-05-22オレオレORM「Moco」についてのお気持ち去年辺りからチマチマとMocoというオレオレORMを作っているので技術的な話ではなくお気持ち的な話を書いてみたくなった。技術的な話は気が向いたら別の記事にしようかなと思ってるけどまだ気分ではないかな。Mocoの思想JavaでDB操作をする時は自分でゴリゴリSQLを書く薄いORMが好んで使われる。JDBCとか使ったことないけどMyBatisもそうなのかな?自分でSQLを書くことには僕は抵抗がないしDomaとかは個人的に結構好きだったりする。遊びでピャッっとWebアプリ作ろうかなになった時、リレーションをJavaの世界で組み立てるのが結構面倒だったりする。複数のCustomerに各Customerが複数のOrderを持っているケースでJavaのオブジェクト煮詰めていくのが結構面倒くさいな~と思ったりしてた。その時に出会ったのがActiveRecordのpreloadで、ActiveRecordでは以下のように書くことができる。customers[0].orderspreloadに関連を書くだけで良い!なんだこれは便利すぎる...。あとSQL書かなくてよいの意外と楽だぞ!?けど補完があまり効かないしそこはJavaのほうが気持ちが良いんだよな...Javaならもっとうまくできるんじゃないのか?となったのが開発着手までの流れです。「リレーションをうまく扱いたいね」と「ちゃんと補完バリバリできる方がいいよね」という思想がベースにあります。Mocoという名前Mocoという謎の名前ですが、これはセブンイレブンの「しろもこ」シリーズから取っています。モジュール名もシュークリームっぽい感じにしてます。僕がすごい好きなイラストレーターがFANBOXで定期的にもこシリーズの話を書いていたのでそこから取りました。ちなみに今まで食べた中ではティラミスもこが一番好きでした。やって気持ちよく書くかJavaの話に戻って、ActiveRecordっぽいものをJavaでやろうとしたライブラリはいくつかあるようですが、Stringで頑張ろうとしている辛いものばかりでした。APIを使ってコンパイル時にクラスを生成することを選択しました。POJOだけユーザーが定義して、そこからいい感じ操作をするためのクラスを二種類生成します。1つ目はPOJOの複数形名のクラスで、カラムを表す定数や後述するEntityListを作るstaticメソッドが生えているTableClassと呼んでいるクラス。2つ目はEntityListと呼んでいるクエリを作って結果を得るためのクラスです。これらを使うことで以下のように書くことができます。:fuga)のような多段preloadをできるようにしたいと考えています。書けば気持ち良いんだろうね...。書けたほうが気持ち良いはず!などあればIssueやPRを送っていただけるとうれしいです。github.comまた、試してみたいだけの方はSQLiteで試せるサンプルリポジトリがあるのでこちらで遊んでみてください。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。