2018年9月8日TweetPocketOpenでDBの接続を行う部分のコードを読んだので、次はDBに対してクエリーを発行する部分を読んでいく。1000})まずは一番わかりやすそうなCreateのコードを見てみよう。DBのトランザクション、クエリー生成、O/Rマッピングなど、非常に長い内容になるため、いくつかのポストに分けて読んでいこうと思う。モデルのInsertを行うCreateメソッドは、main.goに定義されている。scope.callCallbacks(s.parent.callbacks.creates).db}一連のトランザクションを扱うScopeを作成してから、Create関連の処理(コールバック)群を呼ぶ、という構造になっている。value}}NewScope関数で新しいScopeを作成する際には、DBインスタンスの複製が行われる。理由はわからないが、gormでInsertやSelectを行う時のパラメータやエラー情報などはDBインスタンスに保持されるため、複数の処理を走らせた場合におかしなことにならないようにするためではないかと思われる。これらのパラメータはDBではなくScopeが持った方が自然なのではないかという気もするのだが、その辺りはよくわからない。-1}という値をセットしているようだ。これもなぜこのタイミングでセットしているのかはわからない。searchフィールドでは循環参照が発生していそうな気がする。value}加えて、この部分だけ読むと、dbCloneがvalueを持っているので、Scopeが別にvalueを保持するのは冗長な感じがするが、何か理由があったのだろうか。コールバックの呼び出し次にコールバックの呼び出しの方を見てみる。scope}callCallbacksは、渡された関数を自身のScopeを引数にして順番に呼んでいるだけである。関数呼び出し後、自身のScopeのskipLeftがセットされていた場合は残りの関数の呼び出しはスキップされるようになっている。引数で渡されているs.parent.callbacks.createsとは何か追っていこう。*Scopeまず、分かりにくいがここのsはScopeではなくgorm.DBである。(Open関数内での実装)そして、Open関数で作られたDBインスタンスの場合、このdbのparentはdb自身となる。DefaultCallback,callbacksの中身も、Open関数を確認してみるとDefaultCallbackが指定されている。[]*CallbackProcessor}そしてこのDefaultCallbackにはcreatesという関数ポインタの配列がある。したがって、s.parent.callbacks.createsが指すのはここである。DefaultCallbackの内容DefaultCallbackのcreatesの中身がどうなっているのかみてみよう。&Callback{}DefaultCallbackはcallback.go内で定義されているこの変数だ。この定義時点では中身は空だが、callback_create.goやcallback_delete.goのinit()関数の中で内容が追加されている。commitOrRollbackTransactionCallback)}紛らわしいメソッド名だが、Create関数では”create”関連のCallbackProcessorのインスタンスが作られる。c}}そして、Register関数内でparent(つまりここではDefaultCallback)のprocessorsにそのCallbackProcessorが登録される。row_query)にプロセッサーの並び替えが行われる。afterというフィールドがあり、依存関係を指定することができるためだと思われる。afterの依存関係に基づいてソートするような処理になっているが、長くなるため省略。実際のプロセッサーの中身がどのような内容になっているのかは、長くなるため次のポストで読んでいく。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイトご意見、ご感想をお願いします。