PlayとSquerylを使って簡単なデータベースアプリを作成する方法を学ぼうとしています。Playチュートリアルからタスクアプリを作成しましたが、モデル/スキーマを変更して、AnormではなくSquerylを使用するようにします。私はさまざまなチュートリアル、例、および回答を見てきましたが、これを行う方法を実際には理解していません。
したがって、Playチュートリアル(ScalaTodoList)のソースコードが与えられます。Squerylで動作させるにはどうすればよいですか?
すなわち:
- モデルに、、、およびメソッドを実装する
all()
にはどうすればよいですか?(タスクに自動インクリメントIDを使用したい)create()
delete()
- 使用するデータベースアダプタは現在、およびにハードコードされています
Build.scala
(Global.scala
以下を参照)。PlayチュートリアルのAnormの場合と同様に、H2を開発/テストとHerokuのPostgresに自動的に使用するようにするにはどうすればよいですか? - テーブルが自動的に作成されるようにするにはどうすればよいですか?
これは私がこれまでにやったことです
PlayScalaTodoListチュートリアルを完了しました。
、、project/Build.scala
にobject ApplicationBuild
依存関係を追加しました。
// From the "Squeryl Getting Started tutorial"
val posgresDriver = "postgresql" % "postgresql" % "8.4-702.jdbc4"
val h2 = "com.h2database" % "h2" % "1.2.127"
// From the "Squeryl Getting Started tutorial"
libraryDependencies ++= Seq(
"org.squeryl" %% "squeryl" % "0.9.5",
h2
)
// From the Play tutorial
val appDependencies = Seq(
// Add your project dependencies here,
"org.squeryl" %% "squeryl" % "0.9.5", // Copied from above so that it compiles (?)
"postgresql" % "postgresql" % "8.4-702.jdbc4"
)
追加app/Global.scala
(上記のSOの回答から取得、アダプターをH2に変更しただけ):
import play.db.DB
import play.api.Application
import play.api.GlobalSettings
import org.squeryl._
import org.squeryl.adapters._
object Global extends GlobalSettings {
override def onStart(app: Application): Unit =
{
SessionFactory.concreteFactory = Some(
() => Session.create(DB.getDataSource().getConnection(),
dbAdapter));
}
override def onStop(app: Application): Unit =
{
}
val dbAdapter = new H2Adapter(); // Hard coded. Not good.
}
で、インポートを追加し、、、、およびapp/models/Task.scala
のAnorm実装を削除しました。Playチュートリアルのコントローラーは、メソッドがを返すことを期待しています。all()
create()
delete()
all()
List[Task]
import org.squeryl.PrimitiveTypeMode._
import org.squeryl.Schema
import org.squeryl.annotations.Column
case class Task(id: Long, label: String)
object Task extends Schema {
val tasks = table[Task] // Inspired by Squeryl tutorial
def all(): List[Task] = {
List[Task]() // ??
}
def create(label: String) {
// ??
}
def delete(id: Long) {
// ??
}
}
残りのファイルは、Playチュートリアルの最後に残っています。