【问题标题】:Slick insert into postgreSQL巧妙地插入到 postgreSQL
【发布时间】: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


【解决方案1】:

由于值 (?,?,? ...),该语句没有错。 lazy val TaskTableQuery[...] 类型。当您在此对象上调用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 

【讨论】:

  • 谢谢!使用 Await.result(query ,Duration.Inf) 就可以了!
猜你喜欢
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多