読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

OSSを試してハマったログ

scala メモ 日記

Play2.0 + PostgreSQL + ScalaActiveRecord0.2で突っ込んでみてハマったログです。
情報等ほぼ存在しないだろうから、後に踏み入れる人たちに、、、、。

http://www.playframework.org/
http://www.postgresql.jp/
https://github.com/aselab/scala-activerecord

Tables.create は多分DB依存

テーブルも作れるんだよなーと思ったら大ハマリ。
MySQL とかだとうまく行く。AUTO_INCREMENT 句とか素で吐くので、PostgreSQL(9.1)では解釈してくれない。
仕方ないので、Play の evolutions 機能でテーブルを作ろうとする。

user という名前のテーブルが作成できない

PostgreSQL 動作。多分「"」とかで名前を囲むと作れる(未検証)。予約されてるためか、この名前でテーブルが作成できない。
ログが文字化けしてくださったおかげで分からなくて超地獄を見ました。
今日日未設定デフォエンコードが UTF-8 じゃないとかPostgresどんだけー

多分 ScalaActiveRecord0.2 は 0.1 と色々互換しない

コネクション管理周りや、設定の周りが大きく変化している模様。
単純に 0.1 -> 0.2 に上げたら Play 側が爆死しました。

Play2.0 で ScalaActiveRecord0.2 使う際は、移植に注意

https://github.com/aselab/scala-activerecord-sample

に Play2.0 で動作させるようなサンプルがあるが、PlaySupport トレイトあたりは中身を良く読まないと、変な設定拾って爆死します。
眠気と闘いながらやったら爆死しました。

素直に MySQL と組み合わせて使っておけばよかったと思わなくない。

後、ScalaActiveRecord が内部で squeryl 使ってるなら、拾ったクエリを squeryl でクエ書けないかなとか思って爆死しました。
これは単に調査不足なだけな気がするけど、今日はもうげんかひ、、、、。

case class User(@Required var name: String,
                 @Required @Email @Unique var email:String) extends ActiveRecord

こんなん書いてこんなんしてみようとした所

    val query = User.where(_.name === "azalea").query
    val res   = from(query)(v => where(v.name === "azalea").select(v.name))

下記の様なログ吐いて1行目で爆死しました。

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[ClassCastException: models.User$$EnhancerByCGLIB$$22e34966 cannot be cast to models.User]]
	at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1.jar:2.0.3]
	at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1.jar:2.0.3]
	at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor.jar:2.0.2]
	at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1.jar:2.0.3]
	at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor.jar:2.0.2]
	at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor.jar:2.0.2]
	at akka.dispatch.Mailbox.run(Mailbox.scala:179) [akka-actor.jar:2.0.2]
	at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:516) [akka-actor.jar:2.0.2]
	at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259) [akka-actor.jar:2.0.2]
	at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975) [akka-actor.jar:2.0.2]
	at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479) [akka-actor.jar:2.0.2]
	at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) [akka-actor.jar:2.0.2]
Caused by: java.lang.ClassCastException: models.User$$EnhancerByCGLIB$$22e34966 cannot be cast to models.User
	at controllers.Users$$anonfun$index$1$$anonfun$1.apply(Users.scala:46) ~[classes/:2.0.3]
	at com.github.aselab.activerecord.ActiveRecordBaseCompanion$$anonfun$where$1$$anonfun$apply$4.apply(ActiveRecord.scala:149) ~[scala-activerecord-0.2-SNAPSHOT.jar:0.2-SNAPSHOT]
	at com.github.aselab.activerecord.ActiveRecordBaseCompanion$$anonfun$where$1$$anonfun$apply$4.apply(ActiveRecord.scala:149) ~[scala-activerecord-0.2-SNAPSHOT.jar:0.2-SNAPSHOT]
	at org.squeryl.dsl.fsm.BaseQueryYield$$anonfun$whereClause$1.apply(BaseQueryYield.scala:63) ~[squeryl-0.9.5.jar:0.9.5]
	at org.squeryl.dsl.fsm.BaseQueryYield$$anonfun$whereClause$1.apply(BaseQueryYield.scala:63) ~[squeryl-0.9.5.jar:0.9.5]
	at scala.Option.map(Option.scala:133) ~[scala-library.jar:0.11.3]
	at org.squeryl.dsl.fsm.BaseQueryYield.whereClause(BaseQueryYield.scala:63) ~[squeryl-0.9.5.jar:0.9.5]
	at org.squeryl.dsl.fsm.BaseQueryYield.queryElements(BaseQueryYield.scala:71) ~[squeryl-0.9.5.jar:0.9.5]
	at org.squeryl.dsl.ast.QueryExpressionNode.<init>(QueryExpressionNode.scala:35) ~[squeryl-0.9.5.jar:0.9.5]
	at org.squeryl.dsl.AbstractQuery.buildAst(AbstractQuery.scala:103) ~[squeryl-0.9.5.jar:0.9.5]
	at org.squeryl.dsl.boilerplate.Query1.<init>(Query1.scala:34) ~[squeryl-0.9.5.jar:0.9.5]
	at org.squeryl.dsl.boilerplate.FromSignatures$class.from(FromSignatures.scala:25) ~[squeryl-0.9.5.jar:0.9.5]
	at org.squeryl.PrimitiveTypeMode$.from(PrimitiveTypeMode.scala:40) ~[squeryl-0.9.5.jar:0.9.5]
	at com.github.aselab.activerecord.ActiveRecordBaseCompanion$class.where(ActiveRecord.scala:149) ~[scala-activerecord-0.2-SNAPSHOT.jar:0.2-SNAPSHOT]
	at models.User$.where(User.scala:35) ~[classes/:na]
	at controllers.Users$$anonfun$index$1.apply(Users.scala:46) ~[classes/:2.0.3]
	at controllers.Users$$anonfun$index$1.apply(Users.scala:44) ~[classes/:2.0.3]
	at play.api.mvc.Action$$anonfun$apply$4.apply(Action.scala:204) ~[play_2.9.1.jar:2.0.3]
	at play.api.mvc.Action$$anonfun$apply$4.apply(Action.scala:204) ~[play_2.9.1.jar:2.0.3]
	at play.api.mvc.Action$$anon$1.apply(Action.scala:170) ~[play_2.9.1.jar:2.0.3]
	at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126) ~[play_2.9.1.jar:2.0.3]
	at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126) ~[play_2.9.1.jar:2.0.3]
	at play.utils.Threads$.withContextClassLoader(Threads.scala:17) ~[play_2.9.1.jar:2.0.3]
	at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:125) [play_2.9.1.jar:2.0.3]
	... 11 common frames omitted

眠いので、まともに解析してないけど、最初の where 句に食わせるためのインスタンスを取得しようとして別なもの拾って、クエリに変換する過程で型違うと落ちているように見える。
何にせよいきなり変なことするなってことで寝まふ。