ラベル PlayFramework の投稿を表示しています。 すべての投稿を表示
ラベル PlayFramework の投稿を表示しています。 すべての投稿を表示

2014-01-01

Slick+Playのテーブル生成

Slickでモデルを作成すると、モデルからテーブルを生成することができる。
これが、コード上から生成になるので、起動のたびにテーブルを作られたり、ドロップされても困るので、作成対象のテーブルの有無を確認して実行を決める必要がある。
ルートパッケージにGlobalオブジェクト作成、onStartメソッドをオーバライドすることで、アプリ起動時に処理を実行することができる。
そこで、MTableオブジェクトのgetTablesメソッドを使用して対象のテーブルの存在をチェックしてテーブル作成を実行させてみた。
import models.Users
import play.api.db.DB
import play.api._
import scala.slick.driver.MySQLDriver.simple._
import play.api.Play.current
import scala.slick.jdbc.meta._

object Global extends GlobalSettings {

  override def onStart(app: Application) {
    val ds = Database.forDataSource(DB.getDataSource())
    ds.withSession{ implicit session: Session =>
      if (MTable.getTables ("user") .list.isEmpty)
        Users.ddl.create
    }
  }
}

2013-12-23

Play + Scala + Slick

PlayのDAOは、2.2まではAnormを使用するのが標準ですが、2.3からSlickに変わるらしい。
また、AnormはSQLをそのまま記述することを基本としているので、ORMに慣れきった僕にはORMであるSlickのほうが楽そうってことで、Slickを使うようにプロジェクトの設定を変更する。

参考にしたのはこの記事。

Playの初歩とSlickAdd Star

PlayFrameworkerのisobeです。Scala面白いです。

Play使い始めてしばらくDAO周りでAnormを使ってたのですがノーテーションが冗長すぎて辛いのでSlick(旧ScalaQuery)に乗り換えました。今最新のPlay2.2を使ってるのですが次期2.3では標準ORM(というかDAO)がAnormからSlickに置き変わる予定だそうです。(ってことをSlick使い始めてから知りました)

ライブラリの設定をbuild.sbtにしますが、とりあえず丸パクリ。
libraryDependencies ++= Seq(
  jdbc,
  anorm,
  cache,
  "mysql" % "mysql-connector-java" % "5.1.18",
  "com.typesafe.slick" %% "slick" % "1.0.1",
  "com.typesafe.play" %% "play-slick" % "0.5.0.8",
  "commons-dbcp" % "commons-dbcp" % "1.4")
コネクションの設定はapplication.confですが、こちらは接続先がCloudBeesのDBになるので、CloudBees側の設定に合わせて以下の感じ。
slick.default="models.*"
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:"${MYSQL_URL_MYDB}
db.default.user=${MYSQL_USERNAME_MYDB}
db.default.password=${MYSQL_PASSWORD_MYDB}

あとは、モデル作ってテーブルの生成やらなんやら試そうかってところだけど、IDEAの機能で作ったPlayのプロジェクトがなんか色々微妙な模様。
雛形として形はできているけど、ディレクトリの意味付けがついてないし、新規にScalaオブジェクトを作れる状態じゃなかった。
初期設定的にまずかったのか、機能が不完全なのか不明。
とりあえず、CloudBeesで作られたgitリポジトリからPlayの初期プロジェクトをcloneして、play ideaして使えば大丈夫みたい。

というわけで、application.confの変更は不要になり、build.sbtの代わりにBuild.scalaを編集。
import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

    val appName         = "playsignage"
    val appVersion      = "1.0"

    val appDependencies = Seq(
      // Add your project dependencies here,
      "mysql" % "mysql-connector-java" % "5.1.21",jdbc, anorm,
      cache,
      "com.typesafe.slick" %% "slick" % "1.0.1",
      "com.typesafe.play" %% "play-slick" % "0.5.0.8",
      "org.slf4j" % "slf4j-nop" % "1.6.4",
      "commons-dbcp" % "commons-dbcp" % "1.4"
    )

    val main = play.Project(appName, appVersion, appDependencies).settings(
      // Add your own project settings here      
      testOptions in Test += Tests.Argument("junitxml", "console")
    )

}
てな感じでどうだろうか?

ここまで設定を直してplay ideaをやり直せば、ideaプロジェクトのライブラリ設定に反映されました。

IDEAでPlayのプロジェクトを作り、CloudBeesの設定をする途中まで

とりあえず、IntelliJ IDEAを起動して、新しいプロジェクトを作る。

ScalaのPlay Moduleを選ぶ。
Playで作るサイネージ、そのままの名前。

で、設定画面でCloudBeesのアプリケーションサーバを設定する。
CloudBees Serverを追加。

CloudBeesで登録した、ドメイン、ユーザ名、パスワードを入力。
「Download client libraries」ボタンをクリックすると、ライブラリがダウンロードされて、接続できるようになるので、「Test connection」ボタンをクリックして、接続できることを確認。
「OK」で、登録完了。
忘れちゃいけないのが、CloudBeesはwarでデプロイするので、warを作成する設定をすること。

Project Structure画面で「WebApplication:Exploded」を選んで・・・その先がまだ良くわかってない。

この先は、またイロイロ試してから書く。

CloudBees + IntelliJ IDEA + Play2 + Scalaという試み

放置してたこのブログを、なんとなく再開。

会社の勉強会で作ろうとしてたデジタルサイネージを、最近覚えた技術とこれから覚えたい技術を散りばめて作りなおそうかと思いたったので、備忘録として。

PaasにCloudBeesを選んだのは、Jenkinsを使ってみたかったのとPlayFrameworkをサポートしてるから。Jenkinsを使いこなせるかわかんないけど。

IDEに使うIntelliJ IDEAはScalaやるならEclipse(ScalaIDE)よりイイって色んなとこで見たので。有料なので会社でも使えるか微妙だけど、無料期間中に使い倒してほんとに良かったら個人的には購入しようかと。
ここまでほんのちょっと使っただけだけど、かなりヨサゲ。

PlayFramework2とScalaは将来のメインストリームにならないか期待を込めて。

これで、HTML5(できればSVG)を使ったデジタルサイネージをオンラインで作って、安いAndroidタブレットで表示してお店に置くような使い方ができる、サービスを作ろうと思ってます。
できればSVGでと思ってますが行けるかどうかはブラウザの対応レベル次第なので、そこ実験が先か・・・。