Screaming Loud

日々是精進

ScalikeJDBCのInsertで予約語を使う

今更ペルソナ5を始めました。

背景

MySQLのカラムに予約語を使う場合、バッククオートで以下のように囲むことが一般的です。

create table log(id int auto_increment, user_id int, from datetime, to datetime);
insert into log(`user_id`, `from`, `to`) values(1, "2017-08-24 00:00:01", "2017-08-24 23:59:59");

しかし、ScalikeJDBCでQueryDSLを使ってInsert文を書こうとすると、バッククオートが入りません。

注) “org.scalikejdbc” %% “scalikejdbc” % “3.0.1”

対応

以下のようにします。

case class Log(id: Int, userId: Int, from: String, to: String)
object Log extends SQLSyntaxSupport[Log] {
}

DB.localTx { implicit s =>
      withSQL {
        val values = Seq(
          sqls"`user_id`" -> userId,
          sqls"`from`" -> from,
          sqls"`to`" -> to
        insert.into(Log).namedValues(values: _*)
     }.updateAndReturnGeneratedKey.apply()
}

DSL対応誰か作ってほしー(他人任せ