光滑插入postgreSQL

时间:2016-04-20 15:59:52

标签: scala playframework-2.0 slick-3.0

我只是想从光滑添加一行到我的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

1 个答案:

答案 0 :(得分:1)

由于值(?,?,?...),语句没有错。 lazy val Task的类型为TableQuery[...]。当您在此对象上调用insertStatement时,将返回一个字符串,该字符串表示在后台运行的模板SQL字符串。这是预料之中的。 所以这不是问题的指标。

尝试这样的事情:

val db = Database.forConfig("h2mem1")
try {

Await.result(db.run(DBIO.seq(
  // create the schema
  Task.schema.create,

  // insert two User instances
  Task += (2, "abcd", "201-01-01"),

  // print the users (select * from USERS)
  Task.result.map(println))), Duration.Inf)
 } finally db.close