2020/01/01ツイート2014/09/03golangのpqドライバでRedShiftにつないでちょっとハマった話YAPCが終わり、夏も終わり、みなさんいかがお過ごしでしょうか。季節感を先取りしてデザインを冬っぽい感じにしました。最近仕事でRedshiftをつかっておりまして、ご存じのない方に簡単に説明するとAWSで使えるマネージドで列指向でシェアードナッシングな分散データベースっていう説明でいいんでしょうか。定義の分野に明るくないのでとりあえずぼくはそんな認識で使っております。「Goで行こう」というダジャレなのかどうかよくわからないことをぶち上げたというのと、BIツール的なところは比較的言語の作りに依存してどうこうみたいなハマリかたをしなさそうで新しい言語を投入するには無難だなというところで、Redshiftを叩くのをgolangでやっております。RedshiftはPostgreSQLのドライバで接続可能なので、golangに限らずPostgreSQL用のデータベースドライバを使ってプログラムを書けば良いです。TABLEするレシピを書いたときはRubyのpgを使ってクエリを送って大丈夫だねーという確認をしていました。refusedのエラーがでて必ず死ぬ問題に直面しました。クエリは仮ですが、ざっくりこんなコードです。db.Queryでいきなり死んで仕事にならん感じでした。「ふぇーRedshiftがエラーになるーたすけてー」みたいな感じで呟いてみたところ、fujiwaraさんが出てきてどれどれみたいな感じになり、2人でソース読んだりRedshiftじゃなくてPostgreSQLの挙動を確認した結果、Redshiftは無名PREPAREステートメントに対応してないっぽいというところまでわかりました。ちなみにfujiwaraさんは前職でPostgreSQLをずっと使ってたそうで、とりあえずPostgreSQLでわかんないことあったらfujiwaraさんに聞くとなんとかなるのでいつもお世話になっています。pqドライバのソースを読んで確認した結果はこんな感じでした。Statement)でクエリを投げます。Statementに対応していないようで、コネクションが切られてしまいます。すればよいかというと、普通にdb.Prepareでstmtを取得すればOKです。pqドライバはdb.PrepareでStmtオブジェクトを生成してクエリを飛ばす場合はコネクションIDから一意のStatement名を生成します。Statementを実行するのでエラーになりません。nilとまぁそんな感じで、golangでdb.Queryでargs付きのクエリをRedshiftに投げようとして撃沈してしまった方は、普通にdb.Prepareでstmtを作って回避する方法をお試しください。acidlemonです。鎌倉市在住の普通のITエンジニアです。30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。