mysql2 の gem で INSERT しようとしたらドハマリした

Ruby で MySQL への INSERT

原因の根幹はRuby限定ではないでしょうが、Rubyの書き方に起因するものとしてこのようなタイトルにしました。要はMySQLINSERTできないというただそれだけのハマりです。2017年にこんなレガシーな方法で、とは思いますが、一つの事例として。

エラーメッセージ

こういうのです。

(省略):in `_query': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Registered,1,1,1,2,3)' at line 1 (Mysql2::Error)

結論

VARCHAR型はクォートする*1

実例

INSERT 文での VALUE の値を最初は以下のように書いていました。

(#{row[0]},#{row[1]},#{row[2]},#{row[3]})

ところが、2カラム目 と 3カラム目 はVARCHAR型でした。したがって以下のようにすると通りました。

(#{row[0]},"#{row[1]}","#{row[2]}",#{row[3]})

なお、ダブルクォートをそのまま埋め込むので、SQLを変数に入れる場合は%Qなどを使う必要があります。

どうやって解決したか

実直に生成された SQL を MySQL のコマンドラインから打ち込んだら分かりました。今日も見事にドハマりです。

*1:ちなみに DATE や DATETIME はエラーこそ出ませんが NULL が飛んで行くのでやはりクォートする

Powered by はてなブログ