database/sql パッケージでクエリを投げるまでに起こること(1)
よくgoのO/Rマッパーとして gorm を使っているのですが、gormの挙動ではまったりすると内部で使っている標準の database/sql
パッケージの理解が必要になることがあります。これまで直接 database/sql
を使ったことがなかったので、そのクエリを投げるまでの内部動作について調べてみます。今日は、とりあえず sql.Open
するところまで動作を追ったのでそこまで。
サンプルコード
まずは、database/sql
の基本的な使い方として、クエリを投げて複数のレコードを取得する場合にどのようなコードになるかを見てみます。例として、足が6本以上ある動物の一覧が知りたくなった場合のコードを挙げてみます。
package main import ( "database/sql" "fmt" _ "github.com/lib/pq" ) func main() { db, err := sql.Open("postgres", "host=127.0.0.1 port=32768 user=postgres dbname=playground sslmode=disable") if err != nil { panic(err) } defer db.Close() rows, err := db.Query(`SELECT animal, legs FROM animals WHERE legs >= $1`, 6) if err != nil { panic(err) } defer rows.Close() var ( animal string legs int ) for rows.Next() { if err := rows.Scan(&animal, &legs); err != nil { panic(err) } fmt.Printf("%s has %d legs\n", animal, legs) } if rows.Err() != nil { panic(err) } }
postgreSQL を使うことを想定して、ドライバとして github.com/lib/pq
を使っていますが、他のRDBでもimportするドライバを変えれば同じように動くと思います。また、サンプルコードの簡素化のためエラー処理では単に panic
しています。
わざわざ解説するほどのことはないですが、正常に処理が進むと以下のような流れになります。
database/sql
とgithub.com/lib/pq
をimportsql.Open
で*sql.DB
オブジェクトを取得db.Query
でクエリを投げて結果を*sql.Rows
として取得rows.Scan
で結果を変数にマッピングrows.Err
でエラーチェックrows.Close
db.Close
順に、内部でどのような処理がされているのか見ていきましょう。
import
まずはimportからです。
import ( "database/sql" _ "github.com/lib/pq" )
database/sql
パッケージと、ドライバである github.com/lib/pq
パッケージをimportしています。ここで、ドライバの方のimport分にはアンダースコアが使われていますね。このようにimportすることで、pq
パッケージでexportされているものが見えなくなります。パッケージでexportしているオブジェクトが使えなかったらimportする意味がなさそうに見えますが、そんなことはありません。pq
パッケージはimportされる際の副作用として、sql
パッケージへのドライバの登録を行なっています。
具体的に何をやっているのかについては、pq
の init()
関数 を見てみましょう。
func init() { sql.Register("postgres", &Driver{}) }
sql
パッケージの Register
関数に自パッケージの Driver
インスタンスのポインタを渡しています。次に、Register
関数 の方を見てみましょう。
func Register(name string, driver driver.Driver) { driversMu.Lock() defer driversMu.Unlock() if driver == nil { panic("sql: Register driver is nil") } if _, dup := drivers[name]; dup { panic("sql: Register called twice for driver " + name) } drivers[name] = driver }
こちらでは、ドライバを保持するグローバル変数である drivers
に渡されたドライバを登録していることがわかります。この渡されたドライバは、接続の確立やクエリの実行など、今後のいろいろな処理で使われることになります。つまり、ドライバをアンダースコアにエイリアスしてimportし、ドライバから我々が書くコードではなく sql
パッケージに影響を与えることで、必ず sql
パッケージを介してドライバが使われるようになります。これは面白いですね。まあ世の中には他にもっと面白いことがあると思いますが...。
sql.Open
先程登録されたドライバを使って、sql.Open
を行い、データベースの操作に使う *sql.DB
インスタンスを取得します。注意点として、ソースコードのコメント にも書かれている通り、sql.Open
ではデータベースへ接続する下準備をするだけで、接続の確立は行われません。少し直感に反していると思いますが、接続の確立はクエリを投げる時など実際に接続が必要になった時に初めて行われます。コメントの同じ箇所に書かれている通り、sql.Open
に渡した引数で正しく接続ができるのかを確認するには、sql.Ping
を呼ぶ必要があります。ちなみに、gormでは、gorm.Open
の中で sql.Open
した後にちゃんとsql.Ping
が呼ばれていました。
さて、接続する下準備とは具体的にはなんなのかという話ですが、主要な処理は *sql.DB
の connector
プロパティにimportしたドライバから生成した driver.Connector
をセットしていることです。この connector
はのちにデータベースに接続するときに使われます。
まとめ
とりあえず sql.Open
するところまで動作を追ってみましたが、database/sql
とドライバの関係がうまく設計されていて面白かったです。次は db.Query
でレコードを取得して、そのレコードの内容を取り出すところを見ていきます。ちなみに、goの勉強は標準パッケージを読むのが良いと何回か聞いたことがありますが、今回実際に読んでみてたしかにいろいろ勉強になったので、引き続きいろいろ読んでいこうかなという思っています。
「辿り着きたい場所」のない宮森かおりについて
こんにちは、この記事は SHIROBAKO Advent Calendar 2019 の10日目です。どんどんドーナツの方、どーんと行かせていただきます。
SHIROBAKOと「辿り着きたい場所」
SHIROBAKOはどういうアニメか。人によっていろいろな答えがありそうですが、自分は、いろいろな人が仕事を通じて「辿り着きたい場所」に向かっていく物語だと思っています。
SHIROBAKOの前半では「えくそだすっ!」最終話の絵コンテをどうしても進められない木下監督の様子が描かれています。そんな中、監督は舞茸さんとの会話の中で「えくそだすっ!」で自分が本当にやりたかったことに気づき、人が変わったように一気に絵コンテを完成させます。「辿り着きたい場所」という言葉は、その監督の変化を評した本田さんの台詞に登場します。
あおい「絵コンテ、上がりそうでよかったです」
本田「うん、舞茸さん呼んで正解だったよ。辿り着きたい場所がはっきりすると,やるべきことが見えてくるんだな」
「辿り着きたい場所」というのは、たぶん普通に言い換えると「夢」とか「指針」みたいなものの気がしますが、自分の中ではSHIROBAKOを象徴する言葉です。SHIROBAKOでは、全24話の中でいろいろな職種・年齢・能力・性格の人々がそれぞれの辿り着きたい場所に、それぞれのペース・やり方で向かっていきます。辿り着きたい場所を探していたあおいは「えくそだすっ!」「第三飛行少女隊」を通じて自分なりの答えを見つけ、かつて大きな目標を持ちながらも挫折した平岡は再出発の場所を得て、落合さんは野望に向けて淡々とステップアップをしてゆき、本田さんはこれまで向かってきたのとはまったく違う方向に辿り着きたい場所を定めます。丸川社長や河野さんは、「辿り着いた」後も楽しそうに仕事をする大ベテランの姿として描かれているのかもしれません。
さて、そんなアニメであるSHIROBAKOに、辿り着きたい場所がない特異な人物としてあおいの「ねいちゃん」である宮森かおりは登場します。かおりのような人物が登場することも自分がSHIROBAKOを好きな理由の一つなので、今日はそのあたりについて書きたいと思います。
退屈な職場
かおりは7、8話で東京見物にくるという形で突然登場します。かおりが東京に遊びに来たのは、地元でのつまらない仕事から逃れて気晴らしをするためでしょう。
8話で描かれているかおりの職場にあるのは、楽しい仕事や一体感のあるチーム、成長の機会などではなく、どうでもいい合コン、どうでもいいドラマの話、どうでもいい小言を言ってくる先輩です。悲しいですね。
そんな職場にうんざりして東京見物に来たかおりが、りーちゃんとの物見遊山(by あおい)を終えてうに缶をあけながら酒を飲んでいるところに、あおいが夜遅く帰ってきてこんな会話を交わす場面があります。
あおい「うんとね、今日は仕事が予定通り順調に進んで」
かおり「はあ? 予定通りって当たり前でしょ」
あおい「わかってる! 分かってるけどねいちゃん、あのね、予定通りってことはものすっごく、ものすごく珍しいことなんだよ」
かおり「不憫な子...まあ食え」
このとき、かおりはあおいのことを本当に不憫だと感じたんでしょうか。もちろんそれもあるかもしれません。しかし、すべてが予定通り進み、予定通り退屈に終わる毎日を過ごしているかおりにとって、夜遅くに疲弊しつつも充実した様子で帰ってくるあおいは羨ましい存在でもあったのではないかと思います。勝手にうに缶を食べられてしまったことは不憫だと思いますが...。
絵麻とかおり
かおりが登場するSHIROBAKOの7、8話で、メインで描かれているのは実は絵麻です。成長への焦りや将来への不安から「飛ばして」原画を描いてしまった絵麻は、その全てに対して作監の瀬川さんからリテイクを出されてしまいます。その状況を杉江さんや井口さんに助けられながら、絵麻はなんとか乗り越えていきます。かおりが東京見物に来て、気分転換をして地元に帰っていくというのはそれと並行して進むサブストーリーという扱いです。
つまり、7、8話はかおりと絵麻がそれぞれ立ち直って仕事に戻っていく物語だと言えます。しかし、その立ち直り方はまったく対照的ですよね。絵麻は「成長」することで立ち直り、かおりは「気晴らし」することで立ち直っているからです。
絵麻は、杉江さんや井口さんとの関わりを通じて、技術とスピードは全く別の問題であること、好きで始めた仕事でもそのうち新しい目標が必要になること、煮詰まった時は気分転換すること、誰でも最初は真似から始めることを学びます。実力に見合わない仕事の仕方をしてしまいリテイクを出されるという失敗を通じて、作画に関する視座も一段上がっただろうし、つらいときの乗り越え方も覚えたでしょう。この先同じ失敗は繰り返さないだろうし、同じ失敗を繰り返す後輩がいたら導いてあげることもできるはずです。素晴らしいですね。井口さんありがとう。
絵麻「真似していいんですか?」
井口「そうだよ。どんどん見ていいんだよ。それ以外に、どうやってうまくなる? 新人は先輩が描いた動きのパターンをつかんで真似する。自分なりの表現ってのは、それから」
一方のかおりはどうでしょうか。地元での退屈な仕事にうんざりして東京に出てきてやることといえば、りーちゃんとスカイバスに乗って東京見物をする、うに缶を食べながら酒を大量消費する、結婚式に行く人みたいな服を試着する、メイド喫茶に行く...といったいわゆる「気晴らし」ばかりです。ケーキを食べながら次の予定を考える場面では、りーちゃんと以下のような会話がなされます。
かおり「やりたいことないの? あるでしょ? ディナークルーズ行くとか、ニューハーフのショーパブ行くとか」
みどり「やりたいこと...」
かおり「うんうん。夢! 野望!」
みどり「物語が...書きたいです」
りーちゃんの「夢、野望」に対して、かおりが例示する「夢、野望」の気晴らし感がすごすぎる。かおりは、絵麻のように仕事の問題を仕事で成長して解決するのではなく、休日の気晴らしで自分を立て直し、またもとの仕事へと戻っていきます。きっと、かおりは地元に戻ったあとも何かを変える一歩を踏み出すことはないでしょう。退屈な仕事は退屈なまま日々は過ぎていき、耐えられなくなったら休みを取り、また退屈な仕事へ戻っていくというサイクルを繰り返してしまうのではないでしょうか。
いろいろな人生がある
しかし、自分がSHIROBAKOいいなーと思うのは、そんなかおりの生き方がネガティブには描かれていないことです。かおりが地元に帰る朝、あおい宅の玄関先で二人はこんな会話を交わします。
あおい「あ、ねいちゃんさ」
かおり「うん?」
あおい「もういいの? 大丈夫?」
かおり「...まんず、がんばっぺ!」
ここ、とても良いですよね。かおりが地元で行き詰っていることを察しているあおいの気遣いに対して、かおりは前向きに応えます。もちろん、絵麻のように成長して課題をクリアしていければ最高ですが、それと同じくらい、問題は何も解決していなくても、その状況を受け入れ、気分を切り替えて明日も明後日もまたなんとかやっていくだろうかおりも素晴らしいと思います。このとき、あえて普段使わない地元の言葉で返したのは、地元に残り続ける覚悟の表れのようにも聞こえました。作中ではかおりはなぜ地元に残っているのか、仕事以外ではどのような暮らしを送っているかなどはほとんど描かれていませんが、あおいやずかちゃん、りーちゃんとは違う種類の「覚悟と記念と人間の記録」がかおりにもあるのかもしれませんね。
かおりの人生や価値観はメインキャラクターのあおいたちとは正反対です。しかし、冷静に考えるとかおりの方が「普通」の人間じゃないですか? 誰もが仕事を通じてどこかに「辿り着く」わけではないでしょう。むしろそんな人は一握りのはずです。みんなが辿り着く場所に向かっていく作中で、どこにも辿り着かずに仕事をし続ける普通の人間としてかおりを描いているところに、SHIROBAKOのバランスの良さを感じます。
何回見ても面白いSHIROBAKO
自分は今までにSHIROBAKOを何度か見てきています。なんとなくつらいことがあるたびに見ているので、最近この記事を書くために見直していたら妻が「SHIROBAKO見てるけどなんかつらいことでもあったの?」と聞いてきたほどです。
はじめてSHIROBAKOを見たときはかおりの話はたぶんあまり印象に残りませんでした。その頃の自分は研究者を目指していたので、将来に不安を覚えながらも自分の道を進んで行く絵麻に共感を覚えた記憶があります。結局研究者にはなれず、いろいろあって去年、よく知らないけどなんとなくやっていけそうだなと思ったソフトウェアエンジニアとして就職しました。週5日会社に行って、たまに(それこそSHIROBAKOのような)素晴らしい劇的なアニメを見たりして、それはそれとして気晴らしに散歩をしたり、ビールを飲んだり、どうでもよいプログラミングをして、また会社に行っているうちに日々が過ぎていく。なんとなく給料が上がれば良いなとか、プログラミングがうまくなりたいとか曖昧な願望は抱きつつも、辿り着きたい場所があるとはとても言えない。そんな暮らしをしている中でSHIROBAKOを見直して、かおりの姿が自分に重なると同時に、ちゃんとこういう普通の人も描かれていたんだと思って驚いたんですよね。そのあと転職をして、今は仕事も面白くなり、チームで働くことの大切さも少しずつわかってきたので、次にSHIROBAKOを見るときにはまた新たな発見があるかもしれません。
以上です。劇場版楽しみですね。