2016-04-20 18 views
0

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 
+0

mmm, was ist genau die Frage? Die Aussage sieht korrekt aus. Ist ein Fehler ausgeloggt? –

+0

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

+1

* "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

Antwort

1

Die Aussage ist nicht falsch, weil der Werte (,, ...??). Die lazy val Task ist vom Typ TableQuery[...]. Wenn Sie für dieses Objekt insertStatement aufrufen, erhalten Sie eine Zeichenfolge zurück, die die SQL-Zeichenfolge der Vorlage darstellt, die im Hintergrund ausgeführt wird. Das wird erwartet. Das ist also nicht der Indikator für das Problem.

versuchen, etwas wie folgt aus:

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 
+0

Danke! Mit Await.result (Abfrage, Duration.Inf) funktioniert es! – GermainGum

Verwandte Themen