anorm.SQLで"as"句が効かない

Play + Scalaにて

 

問題点

DB.withConnection(dbName) { implicit c =>

      SQL("SELECT date as '日付',count as 'カウント' FROM view3")()

    }

とした場合に、カラム名としてはview3.date,view3.countとなり、asで指定した名前にならない。

 

対処法

application.confのDB設定にuseOldAliasMetadataBehavior=trueを設定する

db.views.url="jdbc:mysql://localhost/dbname?useOldAliasMetadataBehavior=true"

 

参照

https://groups.google.com/forum/?fromgroups=#!topic/play-framework/UMmjOSob9Qc

Play2でのevilutionsファイルの注意点

evolutionsファイルには基本的にはSQL文をそのまま書けばいいのだけど、日本語が入っていると失敗する。

しかもエラー文はとくに出ずにApply scriptの画面がずっとでる。
繰り返しやりすぎると「Too many connection」というエラーがでる。

 

対策としては日本語を書かないようにするしか今は見当たらない

Play環境構築時のjava.lang.ExceptionInInitializerError、java.lang.NoClassDefFoundError

Play2.1 + Scala2.10.0で開発をしようと、それぞれインストールを行っていざplay runでデフォルトページを表示しようとしたらjava.lang.ExceptionInInitializerError とやらがでるわ、ブラウザリロードしてみたらjava.lang.NoClassDefFoundErrorなどがでてくるやらで早速つまった。

エラー文は以下の感じ。

MatchError: java.lang.NoClassDefFoundError: Could not initialize class play.templates.ScalaTemplateCompiler$TemplateAsFunctionCompiler$PresentationCompiler$ (of class java.lang.NoClassDefFoundError) No source available, here is the exception stack trace: scala.MatchError: java.lang.NoClassDefFoundError: Could not initialize class play.templates.ScalaTemplateCompiler$TemplateAsFunctionCompiler$PresentationCompiler$ (of class java.lang.NoClassDefFoundError) sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(PlayReloader.scala:346) sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(PlayReloader.scala:346) scala.Option.map(Option.scala:133) sbt.PlayReloader$$anon$2$$anonfun$reload$2.apply(PlayReloader.scala:346) sbt.PlayReloader$$anon$2$$anonfun$reload$2.apply(PlayReloader.scala:344) scala.Either$LeftProjection.map(Either.scala:374) sbt.PlayReloader$$anon$2.reload(PlayReloader.scala:344) play.core.ReloadableApplication.get(ApplicationProvider.scala:98) play.core.server.Server$class.sendHandler$1(Server.scala:56) play.core.server.Server$$anonfun$getHandlerFor$4.apply(Server.scala:88) play.core.server.Server$$anonfun$getHandlerFor$4.apply(Server.scala:87) scala.util.Either$RightProjection.flatMap(Either.scala:523) play.core.server.Server$class.getHandlerFor(Server.scala:87) play.core.server.NettyServer.getHandlerFor(NettyServer.scala:34) play.core.server.netty.PlayDefaultUpstreamHandler.messageReceived(PlayDefaultUpstreamHandler.scala:103) org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:565) org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:793) org.jboss.netty.handler.codec.http.HttpContentDecoder.messageReceived(HttpContentDecoder.java:104) org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:565) org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:793) org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:455) org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:538) org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:437) org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:565) org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560) org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:84) org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:472) org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:333) org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35) org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102) org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) java.lang.Thread.run(Thread.java:722)

 

以下、解決法

 

問題だったのはplayのディレクトリの場所。私は「C:\Program Files\play-2.1.0」に置いていたのだけど、「Progeam Files」の部分がわるかった。つまり、スペースが入っていること。

なので、「C:\play-2.1.0」に移動してあげると正常に起動した。

MongodbのDB変更

mongodbでのdbpathを変更するのに少し手間取ったのでメモ。

 

mongod --dbpath=/User/homu/Libraly/mongodb/db &

とすると、

listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:27017 

 こんなエラーがでて、変更できない。

すでにdbが動いているので変更できないと怒られているみたい。

なので、mongodbを一度止める

$ ./mongo
use admin
db.shutdownServer() 

これで止まるので、もう一度動かす

mongod --dbpath=/User/homu/Libraly/mongodb/db &

 

これで切り替え成功。

 

追記

ここでエラーがでた場合、lockがかかっていて修復する必要がある。

その場合はMongoDBの公式の方に書かれているのでそちらを参考にするとよい

http://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/

 

ざっと引用

1.ロックしてるファイルを削除する

rm /data/db/mongod.lock

2.DBを修復する

mongod --dbpath /data/db --repair

3.再起動する

mongod --dbpath /data/db