【发布时间】:2016-04-20 15:59:52
【问题描述】:
我只是想将一行从 slick 添加到我的 postgreSQL 数据库中。
这是我想要做的:
val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
import dbConfig.driver.api._
val query = Task += new TaskRow(5, "taskName", status = "other")
println(Task.insertStatement)
val resultingQuery = dbConfig.db.run(query).map(res => "Task successfully added").recover {
case ex: Exception => ex.getCause.getMessage
}
这里是println 的结果:
插入 "task" ("taskname","description","status","datetask","pediocitynumber","periodicitytype") 值 (?,?,?,?,?,?)
结果查询没有任何结果异常或成功。
slick-codegen 3.1.1 生成的代码:
case class TaskRow(taskid: Int, taskname: String, description: Option[String] = None, status: String, datetask: Option[java.sql.Timestamp] = None, pediocitynumber: Option[Int] = None, periodicitytype: Option[String] = None)
/** GetResult implicit for fetching TaskRow objects using plain SQL queries */
implicit def GetResultTaskRow(implicit e0: GR[Int], e1: GR[String], e2: GR[Option[String]], e3: GR[Option[java.sql.Timestamp]], e4: GR[Option[Int]]): GR[TaskRow] = GR{
prs => import prs._
TaskRow.tupled((<<[Int], <<[String], <<?[String], <<[String], <<?[java.sql.Timestamp], <<?[Int], <<?[String]))
}
/** Table description of table task. Objects of this class serve as prototypes for rows in queries. */
class Task(_tableTag: Tag) extends Table[TaskRow](_tableTag, "task") {
def * = (taskid, taskname, description, status, datetask, pediocitynumber, periodicitytype) <> (TaskRow.tupled, TaskRow.unapply)
/** Maps whole row to an option. Useful for outer joins. */
def ? = (Rep.Some(taskid), Rep.Some(taskname), description, Rep.Some(status), datetask, pediocitynumber, periodicitytype).shaped.<>({r=>import r._; _1.map(_=> TaskRow.tupled((_1.get, _2.get, _3, _4.get, _5, _6, _7)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported."))
/** Database column taskid SqlType(serial), AutoInc, PrimaryKey */
val taskid: Rep[Int] = column[Int]("taskid", O.AutoInc, O.PrimaryKey)
/** Database column taskname SqlType(text) */
val taskname: Rep[String] = column[String]("taskname")
/** Database column description SqlType(text), Default(None) */
val description: Rep[Option[String]] = column[Option[String]]("description", O.Default(None))
/** Database column status SqlType(statustask) */
val status: Rep[String] = column[String]("status")
/** Database column datetask SqlType(timestamp), Default(None) */
val datetask: Rep[Option[java.sql.Timestamp]] = column[Option[java.sql.Timestamp]]("datetask", O.Default(None))
/** Database column pediocitynumber SqlType(int4), Default(None) */
val pediocitynumber: Rep[Option[Int]] = column[Option[Int]]("pediocitynumber", O.Default(None))
/** Database column periodicitytype SqlType(periodicitytype), Default(None) */
val periodicitytype: Rep[Option[String]] = column[Option[String]]("periodicitytype", O.Default(None))
}
/** Collection-like TableQuery object for table Task */
lazy val Task = new TableQuery(tag => new Task(tag))
谁能解释我做错了什么?
编辑:
澄清我的问题:
该行没有添加到表中,似乎什么也没发生。我看不到任何异常或错误抛出。 我认为它可能来自sql语句和问号(值(?,?,?,?,?,?))。应该是字段的实际值吧?
更多代码:
class Application @Inject()(dbConfigProvider: DatabaseConfigProvider) extends Controller {
def index = Action {
Ok(views.html.main())
}
def taskSave = Action.async { implicit request =>
println(request.body.asJson)
val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
import dbConfig.driver.api._
val query = Task += new TaskRow(5, "taskName", status = "other")
println(Task.insertStatement)
println(query)
val resultingQuery = dbConfig.db.run(query).map(res => "TAsk successfully added").recover {
case ex: Exception => ex.getCause.getMessage
}
resultingQuery.map(r => println("result : " + r))
Future(Ok(""))
}
}
路线:
PUT /task-save controllers.Application.taskSave
【问题讨论】:
-
嗯,到底是什么问题?该语句看起来正确,您是否有任何错误已注销?
-
不,我没有任何错误或日志。由于值(?,?,?,?,?,?),我认为该陈述是错误的。这是正常的吗?问号是否应该替换为字段的实际值?
-
“我没有任何结果异常或结果查询成功。” - 你是如何检查的?你能显示一些代码吗?问号很好,它们是查询中实际值的占位符。您在此处看到的打印内容称为prepared statement。数据库获取带有占位符的查询,对其进行编译,然后将值插入到查询中,最后执行它。
-
感谢您的链接。我只是添加我运行的代码。我在终端中使用“sbt run”运行我的应用程序,因此我检查了终端中的输出。 “你怎么查到的?”我打印了我的 val 结果查询,但终端中没有打印“任务成功..”或异常。
标签: scala playframework-2.0 slick-3.0