我已经到了地球的尽头寻找这个问题的答案.光滑的2.0没有太多信息.下面是我的地址模型的代码,如何在创建插入后让方法创建返回id?
package models
import play.api.Play.current
import play.api.db.slick.Config.driver.simple._
import play.api.db.slick.DB
object Addresses{
val DB_URL:String = "jdbc:h2:mem:fls-play"
val DB_driver:String = "org.h2.Driver"
class Addresses(tag: Tag) extends Table[(String, String, String, String, String)](tag, "ADDRESSES"){
def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
def city = column[String]("CITY")
def stateName = column[String]("STATE_NAME")
def street1 = column[String]("STREET1")
def street2 = column[String]("STREET2")
def zip = column[String]("ZIP")
def * = (city, stateName, street1, street2, zip)
}
val addresses = TableQuery[Addresses]
def create(city:String, stateName:String, street1:String, street2:String, zip:String) {
DB.withSession{ implicit session =>
addresses …Run Code Online (Sandbox Code Playgroud) 我不知道如何以GuiceApplicationBuilder这种方式配置,我能够加载需要DatabaseConfigProvider注入的控制器.
我想指定一个替代的postgres数据库用于测试,或者在内存数据库中指定(如果可能的话).
码
class User
extends MySpecs
with OneAppPerTest
{
override def newAppForTest( testData: TestData ) = new GuiceApplicationBuilder()
// Somehow bind a database here, I guess?
.build()
"A test" should "test" in
{
val result = Application.instanceCache[api.controller.User]
.apply( app )
.list()( FakeRequest() )
...
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
[info] - should return an entity *** FAILED ***
[info] com.google.inject.ConfigurationException: Guice configuration errors:
[info]
[info] 1) No implementation for play.api.db.slick.DatabaseConfigProvider was bound.
[info] while locating …Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用Scala和Play 2 Framemork构建应用程序.我使用激活工具创建了一个新项目,基于"play-scala-intro"当前模板.
该模板有一个使用Play-Slick 1.0管理依赖关系的示例应用程序,并配置了H2 DB,可以正常工作.
当我尝试更改为Postgres DB时,我遇到了麻烦.我收到错误500,告诉我:
"无法连接到数据库[默认]".
在堆栈跟踪中,例外是:
"已配置的Slick驱动程序org.postgresql.Driver不是请求的配置文件slick.profile.BasicProfile的实例"
那么......我已经做了什么:
我在build.sbt文件中添加了依赖项:
"org.postgresql"%"postgresql"%"9.4-1201-jdbc41"
在我的配置文件(application.conf)中,数据库连接配置为:
slick.dbs.default.driver = org.postgresql.Driver slick.dbs.default.db.url ="jdbc:postgresql:// localhost:5432/hello_play"slick.dbs.default.db.user ="postgres"slick .dbs.default.db.password = ""
PS:我也试过过slick.dbs.default.driver ="org.postgresql.Driver"......
PS2:我的db密码为空.我正在与PgAdmin连接而没有任何问题
我用PostgreSQL 9.4数据库创建了一个空的(激活模板play-scala)Play 2.4.3应用程序并尝试使用Slick 3.1.0,但是它引发了一个错误:
play.api.UnexpectedException: Unexpected exception[SQLTimeoutException: Timeout after 1000ms of waiting for a connection.]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:165) ~[play-server_2.11-2.4.3.jar:2.4.3]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:121) ~[play-server_2.11-2.4.3.jar:2.4.3]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.7.jar:na]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:121) ~[play-server_2.11-2.4.3.jar:2.4.3]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:119) ~[play-server_2.11-2.4.3.jar:2.4.3]
at scala.util.Success.flatMap(Try.scala:231) ~[scala-library-2.11.7.jar:na]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:119) ~[play-server_2.11-2.4.3.jar:2.4.3]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:111) ~[play-server_2.11-2.4.3.jar:2.4.3]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.11.7.jar:na]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) ~[akka-actor_2.11-2.3.13.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[scala-library-2.11.7.jar:na]
Caused by: java.sql.SQLTimeoutException: Timeout after 1000ms of waiting for a connection.
at com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:227) ~[HikariCP-java6-2.3.7.jar:na]
at com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:182) ~[HikariCP-java6-2.3.7.jar:na] …Run Code Online (Sandbox Code Playgroud) 我正在遵循Slick文档的指导原则,我不明白我在做错了什么:
package models
import scala.slick.session.Database
import Database.threadLocalSession
import scala.slick.jdbc.{GetResult, StaticQuery => Q}
import javax.sql.DataSource
import Q.interpolation
object Data {
case class User(user: String, password: String)
lazy val db = Database.forName("default")
def result: Option[User] = {
db.withSession {
sql"SELECT user, password FROM user WHERE user = 'user' AND password = 'pass'".as[User]
}
}
}
Run Code Online (Sandbox Code Playgroud)
这条线
sql"SELECT user, password FROM user WHERE user = 'user' AND password = 'pass'".as[User]
Run Code Online (Sandbox Code Playgroud)
给我这个:
Multiple markers at this line
- could not find implicit …Run Code Online (Sandbox Code Playgroud) 我正在尝试升级到Slick 3.0.0和Play 2.4(Scala),但删除行无效.在下面的代码中,一切正常:查询所有行,插入和更新 - 除了删除.
package dao
import scala.concurrent.Future
import models._
import models.Tables._
import play.api.Play
import play.api.db.slick.DatabaseConfigProvider
import play.api.db.slick.HasDatabaseConfig
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import slick.driver.JdbcProfile
class UserDAO extends HasDatabaseConfig[JdbcProfile] {
protected val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
import driver.api._
def all(): Future[List[UserRow]] = db.run(Tables.User.result).map(_.toList)
def findByEmail(email: String): Future[Option[UserRow]] = {
db.run(Tables.User.filter(_.email === email).result.headOption)
}
def update(id: Int, newData: UserRow): Future[Int] = {
db.run(Tables.User.filter(_.id === id).update(newData))
}
def delete(id: Int): Future[Int] = {
db.run(Tables.User.filter(_.id === id).delete)
}
}
Run Code Online (Sandbox Code Playgroud)
该代码生成以下编译错误:
value delete is not …Run Code Online (Sandbox Code Playgroud) 这是我修改Play框架的第一天,我在进化方面遇到了困难.我正在使用Play 2.4.
我从上来的许多选择了一个示例应用程序activator ui,它使用play-slick与play-slick-evolutions用于数据库连接和演进.
我已经仔细阅读了文档,但我似乎找不到从命令行运行演变的方法.当我activator在bash上运行时,我会被抛入一个shell中,并且help没有提出任何关于运行evolution或浮油的信息.
我已经做了一段时间的PHP,所以我习惯于从命令行上/下运行它们.我可以从数据库客户端删除表,activator run这应该提示我运行演进,但我正在寻找正确的手动方式来执行此操作.我想这是可能的,因为它需要在部署时完成.
我有以下使用PlaySlick连接到数据库的DAO.该类有一个read我需要使用ScalaTest测试的方法.我的问题是我不知道如何模拟DatabaseConfigProvider在UsersDAO类中注入它并测试read方法.这是要测试的类:
class UsersDAO @Inject()(@NamedDatabase("mydb")
protected val dbConfigProvider: DatabaseConfigProvider)
extends with HasDatabaseConfigProvider[JdbcProfile] {
import driver.api._
val db1 = dbConfigProvider.get[JdbcProfile].db
def read (sk: Int) = {
val users = TableQuery[UserDB]
val action = users.filter(_.sk === sk).result
val future = db1.run(action.asTry)
future.map{
case Success(s) =>
if (s.length>0)
Some(s(0))
else
None
case Failure(e) => throw new Exception ("Failure: " + e.getMessage)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试编写测试:
class UserDAOTest extends PlaySpec with OneAppPerSuite {
implicit override lazy val …Run Code Online (Sandbox Code Playgroud) 使用play框架运行测试时,我遇到了进化问题
测试看起来像这样:
class TestFooController extends PlaySpec with GuiceOneServerPerSuite {
"foo endpoint should store some data" in {
val wsClient = app.injector.instanceOf[WSClient]
val url = s"http://localhost:$port/foo"
val requestData = Json.obj("foo" -> "bar")
val response = await(wsClient.url(url).post(requestData))
response.status mustBe OK
}
}
Run Code Online (Sandbox Code Playgroud)
数据库配置如下所示:
slick.dbs.default.driver="slick.driver.H2Driver$"
slick.dbs.default.db.driver="org.h2.Driver"
slick.dbs.default.db.url="jdbc:h2:mem:play"
Run Code Online (Sandbox Code Playgroud)
假设有一个创建表的进化脚本,foos这个脚本在开发模式下工作正常.
运行测试时,抛出以下错误:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[JdbcSQLException: Table "foos" not found;
foos无法找到该表,因此我假设尚未应用数据库演变.
然后我将数据库配置更改为在开发模式下使用的postgresql.
slick.dbs.default.driver = "slick.driver.PostgresDriver$"
slick.dbs.default.db.driver = "org.postgresql.Driver"
slick.dbs.default.db.url = "jdbc:postgresql://localhost:5432/foo-test"
slick.dbs.default.db.user = "user"
slick.dbs.default.db.password = "password"
Run Code Online (Sandbox Code Playgroud)
使用此配置,测试工作正常,数据存储在数据库中,因此数据库演进运行得很好. …
scala playframework playframework-evolutions play-slick playframework-2.6
我有一个Play 2.2.1应用程序,它使用play-slick 0.5.0.8将数据持久保存到Postgresql后端,而SecureSocial 2.1.2则用于处理用户授权.
由于播放光滑的事务是阻塞的,我slick-context在我的/conf/application.conf文件中创建了一个单独的执行上下文,根据插件的Wiki中的说明:
play {
akka {
actor {
slick-context = {
fork-join-executor {
parallelism-min = 300
parallelism-max = 300
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我创建一个在单独的执行上下文中运行的控制器Action,并且不会阻止默认线程池中的线程.例如./app/controllers/Application.scala:
示例一 - 使用play-slick的DBAction:
import play.api.db.slick._
object Application extends Controller{
// this controller Action won't block threads in the default pool since DBAction uses my separate slick-context execution context
def recipes = DBAction { implicit rs =>
val recipes = Query(Recipes).list …Run Code Online (Sandbox Code Playgroud) scala playframework securesocial play-slick playframework-2.2
play-slick ×10
scala ×8
slick ×7
postgresql ×2
database ×1
guice ×1
mysql ×1
scalatest ×1
securesocial ×1