Вставка в postgreSQL

Я просто пытаюсь добавить строку из пятна в мою базу данных 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" ("имя задачи", "описание", "состояние","datetask","pediocitynumber", тип perioditytype) (?,?,?,?,?,?)

У меня нет результирующего исключения или успеха из полученного запроса.

Код, созданный с помощью 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 ответ

Решение

Утверждение не является неправильным из-за значений (?,?,? ...). 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 
Другие вопросы по тегам