Scala 更新查询的 Slick 3 不起作用
Slick 3 for scala update query not functioning
首先我想声明我是 slick 的新手,我使用的是 3.1.1 版。我一直在阅读手册,但无法使我的查询正常工作。要么我的连接字符串有问题,要么我的 Slick 代码有问题。我从这里 http://slick.typesafe.com/doc/3.1.1/database.html and my update example from here bottom of page http://slick.typesafe.com/doc/3.1.1/queries.html 得到了我的配置。好的,这是我的代码
应用程序配置。
mydb= {
dataSourceClass = org.postgresql.ds.PGSimpleDataSource
properties = {
databaseName = "Jsmith"
user = "postgres"
password = "unique"
}
numThreads = 10
}
My Controller -- 调用数据库table - relations
package controllers
import play.api.mvc._
import slick.driver.PostgresDriver.api._
class Application extends Controller {
class relations(tag: Tag) extends Table[(Int,Int,Int)](tag, "relations") {
def id = column[Int]("id", O.PrimaryKey)
def me = column[Int]("me")
def following = column[Int]("following")
def * = (id,me,following)
}
val profiles = TableQuery[relations]
val db = Database.forConfig("mydb")
try {
// ...
} finally db.close()
def index = Action {
val q = for { p <- profiles if p.id === 2 } yield p.following
val updateAction = q.update(322)
val invoker = q.updateStatement
Ok()
}
}
我上面的代码可能有什么问题?我有一个使用纯 JDBC 的单独项目,此配置非常适合它
db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost:5432/Jsmith"
db.default.user="postgres"
db.default.password="unique"
你还没有运行你的行动。 db.run(updateAction)
分别执行您的查询和您对数据库的操作(未测试):
def index = Action.async {
val q = for { p <- profiles if p.id === 2 } yield p.following
val updateAction = q.update(322)
val db = Database.forConfig("mydb")
db.run(updateAction).map(_ => Ok())
}
db.run()
returns一个Future
最终会完成。然后它被简单地映射到一个 Result
in play.
另一方面,q.updateStatement
只会生成一个 sql 语句。这在调试时很有用。
查看我项目中的代码:
def updateStatus(username: String, password: String, status: Boolean): Future[Boolean] = {
db.run(
(for {
user <- Users if user.username === username
} yield {
user
}).map(_.online).update(status)
}
首先我想声明我是 slick 的新手,我使用的是 3.1.1 版。我一直在阅读手册,但无法使我的查询正常工作。要么我的连接字符串有问题,要么我的 Slick 代码有问题。我从这里 http://slick.typesafe.com/doc/3.1.1/database.html and my update example from here bottom of page http://slick.typesafe.com/doc/3.1.1/queries.html 得到了我的配置。好的,这是我的代码
应用程序配置。
mydb= {
dataSourceClass = org.postgresql.ds.PGSimpleDataSource
properties = {
databaseName = "Jsmith"
user = "postgres"
password = "unique"
}
numThreads = 10
}
My Controller -- 调用数据库table - relations
package controllers
import play.api.mvc._
import slick.driver.PostgresDriver.api._
class Application extends Controller {
class relations(tag: Tag) extends Table[(Int,Int,Int)](tag, "relations") {
def id = column[Int]("id", O.PrimaryKey)
def me = column[Int]("me")
def following = column[Int]("following")
def * = (id,me,following)
}
val profiles = TableQuery[relations]
val db = Database.forConfig("mydb")
try {
// ...
} finally db.close()
def index = Action {
val q = for { p <- profiles if p.id === 2 } yield p.following
val updateAction = q.update(322)
val invoker = q.updateStatement
Ok()
}
}
我上面的代码可能有什么问题?我有一个使用纯 JDBC 的单独项目,此配置非常适合它
db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost:5432/Jsmith"
db.default.user="postgres"
db.default.password="unique"
你还没有运行你的行动。 db.run(updateAction)
分别执行您的查询和您对数据库的操作(未测试):
def index = Action.async {
val q = for { p <- profiles if p.id === 2 } yield p.following
val updateAction = q.update(322)
val db = Database.forConfig("mydb")
db.run(updateAction).map(_ => Ok())
}
db.run()
returns一个Future
最终会完成。然后它被简单地映射到一个 Result
in play.
q.updateStatement
只会生成一个 sql 语句。这在调试时很有用。
查看我项目中的代码:
def updateStatus(username: String, password: String, status: Boolean): Future[Boolean] = {
db.run(
(for {
user <- Users if user.username === username
} yield {
user
}).map(_.online).update(status)
}