スキップしてメイン コンテンツに移動

NULLのcolumnを含むDBでデータを取得する/Golang

どうも、@CreatorQsFです。我が家にもやっと春が舞い戻ってまいりました。

さて、僕はもともとCとPHPとMySQLでサービス作ってた人です。そんな中で世紀末ぐらい困ったことが会ったので記しておきます。

まず、PHPでの時わたしはDB関連は全て自作していました。これでも一応SQLかけるので。
ですが、Goに変えてからgithubなどのLibraryを積極的に使うようにしています。フレームワークも今はrevelを使ってます(╹◡╹)

そして、当然のごとくgorpを使いはじめるわけなんですが…これが意外と難しい。というよりPHPの成り上がり下克上果たせなかった系Goプログラマには結構問題点が多くて。私自身にですが。

まず、DBを使うのに、structと組み合わせるためにマッピングしなきゃならない。いや正確に言うと、今まではDBから取得したらそれが自動的にオブジェクトに落とし込めていたので、なんか気にすることなかったんですな。
だけど、最近のモダンなやつ見てるとどうもそうでもないらしい。構造体を作ってそこに落としこむのが主流なのかな。

ってことで、やってみたのはいいものの…

…動かないっす先輩。
思ったとおりに行かないっす

原因は、MySQLのcolumnにNULLが含まれているためでした。そこで、sql.NullStringの存在を知ります。

で、それを

  for _, l := range list {
    p := l.(*models.A)
    fmt.Printf("%d,%t, %s\n", p.Id,p.Status,p.Url)
           
  }

こんなかんじに調理したとします。
この青四角のところが大問題なわけで、最初こう書きました。

result string = p.Url

そうすると、みんな大好き型エラー。
で、次にこう。

result string = fmt.Sprintf("%v",p.Url)

いや、動いたんですけど…。問題はそうじゃなくて、吐出されたものがめちゃめちゃに汚い。オエッの方じゃなくて。

で、なんじゃこりゃと思って、次にこう。

result string = fmt.Sprintf("%T",p.Url)

ちなみに、%Tは型を表示します。
そうして、どうも構造体っぽいやつだな、と。
で、その中でもStringにほしい値が入っていたので、こう。

result string = smt.Sprintf("%s",p.Url.String)

万事解決。多分Cとかならすぐに気づいたんでしょうけど、どうもGoにまだ体がついて行かなくて…。そういう問題じゃないかも。w

というわけで、sql.NullStringを使ったら、最後にStringをつけると綺麗に値が出力できて幸せになれるよ、というお話でした。めっちゃ初心者っぽいなw

コメント

このブログの人気の投稿

bashをemacsモードからvimモードに戻した

人類、いや私が、幾度となく挑戦してきた、「bashをvim modeで使う」こと。 vimよりもbashは使ってきた時間が長いだけに、ずっと慣れなくて。でも使ってる機能が結局ctrl-eとctrl-aくらいで、他はカーソル移動を頑張ってたところが多いのはわかっていた。 emacs式の移動を覚えようとしたこともあるものの、それを覚えるよりはvimモードで使ってしまうのが速いという結論に至った。altキーとかいちいち覚えてられん。それよりescを押してしまったほうが速い。 結局、決め手は、というより自分の中で決めていて、普通のこういうVimじゃない場面のエディタでVim式のカーソル移動を極普通に繰り出し予想を裏切る動き方をして手が止まったらVim modeにしようと考えていた。 それが、最近はブラウザでこうやって書いていても自然とwやAを押しそうに成るので、これはそろそろかと思って、再び挑戦。 今度はいつまで続くかな。

GoogleAppsEngineでのGolangが神だった。

どうも、改めまして@CreatorQsFです。やっぱりGolangキてますね〜。 というわけで、今日はGolangをGoogleAppsEngine(通称GAE)で動かす方法や、その真髄をここに書きたいと思います。 ちなみに、どちらもGoogle開発のものなので、とても仲が良いです。(といいつつついこの前まで、この2つの関係はbetaでしたw) というわけで、まずは簡単に環境開発から。 環境開発 まずは こちら から、GoLangのAppEngineSDK(Golangをwebアプリケーションとして簡単に動かすためのもの)を落としてきます。 自分の環境にあったものを落としてください。自分がどれを落とせばいいかわからない人は、Twitterで@CreatorQsF宛に聞くか、Hangoutで私まで。 で、こちらをダウンロードしてきたら、ダウンロードフォルダよりFinderで好きな場所に移動して、展開してください。 で、展開したらそのDirectory名を抑えてください。たとえば、ダウンロードフォルダで展開したなら、/Users/あなたのMacのユーザー名/Downloads/go_appengineです。ここではこれを、「展開したディレクトリ名」と呼びます。 で、そうしましたら、自分のホームディレクトリ(/Users/あなたのMacのユーザー名/)に.bash_profileというファイルを作ります。というより、golangの環境を作った時に多分bashrcだかなんだかがあると思うので、そこに先ほど抑えた「展開したディレクトリ名」をこのように書き込みます。 export PATH= 「展開したディレクトリ名」 :$PATH つまり、Downloadsで展開した人は、 export PATH=/Users/あなたのMacのユーザー名/Downloads/go_appengine:$PATH というわけです。 で書き込んだら、Terminalでこのパスを通すために source ~/.bash_profile (ここは適宜)を実行します。 で、そこまで来たらもう終わったも同然です。 なにかプロジェクトを作ってみたいですか? HelloWorldやってみよう テキトウなディレク...

Vaffle.vimがいい感じ

実はいまのいままで、ずっとUnite.vimを使い続けてきていました。 Shougoさんのunite.vimは確かに素晴らしかったです。しかしながら、私には到底使い切れるものでもなく、もったいないとおもいつつ、ファイラーとmruのみを使う日々が続いておりました。 御存知の通り、随分前にご本人はすでにuniteからdeniteへと移行をしています。 知らなかったわけではないんですが、動いてるし速度にも問題を感じることがなかったので放置していました。 しかし今回、現状に合わせて、この部分を考え直すことにしました。要するにVimのファイラをどうしよう問題です。 で、いろいろ見た限り、わたしには、 https://github.com/cocopon/vaffle.vim これが最も適しているようでした。 ブログ記事はこちらです。 http://cocopon.me/blog/?p=6084 かなり気に入っています。動作はなかなかに速いですし、hjklで移動できる感覚も、なれると良いものですね。 あとはmruをどうしようかなーというところのみとなりました。