Ich versuche gerade eine Zeile aus Slick zu meiner postgreSQL Datenbank hinzuzufügen.Slick in postgreSQL einfügen
Hier ist, was ich zu tun versucht:
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
}
Hier das Ergebnis println
:
Einsatz in "Aufgabe" ("Taskname", "Beschreibung", "Status", "datetask "," pediocitynumber "," periodicitytype ") Werte (?,?,?,?,?,?)
Ich habe keine Ergebnisausnahme oder Erfolg von der resultierenden Abfrage.
-Code generieren von 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))
Könnte jemand erklären, was ich falsch mache?
EDIT:
meine Frage zu klären:
Die Zeile nicht in der Tabelle hinzugefügt wird, wie es scheint, dass nichts passieren. Ich kann keine Ausnahme oder einen Fehler sehen. Ich denke, es könnte aus der SQL-Anweisung und den Fragen Markierungen (Werte (?,?,?,?,?,?)) Kommen. Es sollten die tatsächlichen Werte der Felder sein, oder?
Weitere Code:
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(""))
}
}
Route:
PUT /task-save controllers.Application.taskSave
mmm, was ist genau die Frage? Die Aussage sieht korrekt aus. Ist ein Fehler ausgeloggt? –
Nein Ich habe keinen Fehler oder log. Ich dachte, die Aussage sei falsch wegen der Werte (?,?,?,?,?,?). Ist das normal? Soll das Fragezeichen durch den tatsächlichen Wert des Feldes ersetzt werden? – GermainGum
* "Ich habe keine Ergebnisausnahme oder Erfolg von der resultierenden Abfrage." * - Wie haben Sie das überprüft? Kannst du etwas Code zeigen? Die Fragezeichen sind in Ordnung, sie sind Platzhalter für die tatsächlichen Werte in der Abfrage. Was Sie hier sehen, heißt eine [vorbereitete Aussage] (https://en.wikipedia.org/wiki/Prepared_statement). Die Datenbank ruft die Abfrage mit Platzhaltern ab, kompiliert sie und fügt dann die Werte in die Abfrage ein und führt sie schließlich aus. – alextsc