前回
今回は
前回簡単にjsonデータのやり取りが出来たので、今回はDBにデータを保存するところをやりたいと思います
Quill
使用するのはQuillです。
http://getquill.io#quotation-introduction
Slickでもなく、ScalikeJDBCでもなくQuillです。
参考
http://takezoe.hatenablog.com/entry/2016/03/03/210701
http://yuutookun.hatenablog.com/entry/2016/03/07/081722
マッピング
QuillはSlickと違ってcase classをそのままテーブル定義として扱うことが出来るようです。
そのためcase classとテーブル定義は完全一致していなければなりません。(大文字小文字もひっくるめて完全一致です!)
※http://getquill.io#extending-quill-mapped-encoding のNaming strategyを見ると、SnakeCaseとかの指定で、完全でなくても良いのかもしれませんが
sbt
"io.getquill" % "quill-async_2.11" % "0.6.0",
"com.zaxxer" % "HikariCP" % "2.4.3",
"com.typesafe" % "config" % "1.3.0"
設定
mysql
↓を参考にdockerでmysqlを立ち上げておいてスキーマとテーブルを作成します。
http://qiita.com/T0000N/items/e5bac2e5bcdf476824f6
-- MySQL Script generated by MySQL Workbench
-- 06/24/16 00:07:32
-- Model: New Model Version: 1.0
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema handshake
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema handshake
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `handshake` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `handshake` ;
-- -----------------------------------------------------
-- Table `handshake`.`Groups`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `handshake`.`Groups` (
`group_id` BIGINT(20) NOT NULL COMMENT '',
`name` VARCHAR(45) NOT NULL COMMENT '',
PRIMARY KEY (`group_id`) COMMENT '')
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
application.conf
db.host=192.168.99.100
db.port=32773
db.user=root
db.password=topsecret
db.database=handshake
db.poolMaxQueueSize=4
db.poolMaxObjects=4
db.poolMaxIdle=999999999
db.poolValidationInterval=100
Code
package repository
import io.getquill._
import io.getquill.naming.Literal
import models.Groups
import scala.concurrent.ExecutionContext.Implicits.global
/**
* Created by Fumiyasu on 2016/06/22.
*/
class GroupRepository {
lazy val db = source(new MysqlAsyncSourceConfig[Literal]("db"))
def save(groups: Groups) = {
val q = quote(query[Groups].insert)
db.run(q)(List(groups))
}
}
今回はMysqlを使用するのでMysqlAsyncSourceConfig
を使用します。
Literal
はcase class完全一致だと思います。
たったこれだけのコードでインサート出来るという。。。
インサート処理ですが、
db.run(q)(groups)
でもイケるみたいなことがドキュメントにありますが、Listにしないとエラーになりました。。。(なんで?