Ich bin neu in Slick 3 und bisher habe ich verstanden, dass db.run asynchroner Aufruf sind. Die .map oder .flatMap wird ausgeführt, sobald die Zukunft zurückgegeben wird.SLICK 3.0 - mehrere Abfragen voneinander abhängig - db.run (Aktion)
Das Problem in meinem Code unten ist, dass alle Unterabfragen nicht funktionieren (verschachtelte db.run).
Konzeptionell, was bekomme ich nicht? Ist es gültig, diese Art von Code wie unten zu tun? Grundsätzlich in der Map der ersten Abfrage mache ich einige Aktionen abhängig von der ersten Abfrage.
Ich sehe überall für Schleifen mit der Ausbeute, ist es die einzige Möglichkeit zu gehen? Bezieht sich das Problem in meinem Code auf den zurückgegebenen Future-Wert?
val enterprises = TableQuery[Enterprise]
val salaries = TableQuery[Salary]
//Check if entered enterprise exists
val enterpriseQS = enterprises.filter(p => p.name.toUpperCase.trim === salaryItem.enterpriseName.toUpperCase.trim).result
val result=db.run(enterpriseQS.headOption).map(_ match
{
case Some(n) => {
//if an enterprise exists use the ID from enterprise (n.id) when adding a record to salary table
val addSalary1 = salaries += new SalaryRow(0, n.id, salaryItem.worker)
db.run(addSalary1)
}
case None => {
//if an enterprise with salaryItem.enterpriseName doesn't exist, a new enterprise is inserted in DB
val enterpriseId = (enterprises returning enterprises.map(_.id)) += EnterpriseRow(0, salaryItem.enterpriseName)
db.run(enterpriseId).map{
e => {
val salaryAdd2 = salaries += new SalaryRow(0, e, salaryItem.worker)
db.run(salaryAdd2)
}
}
}
})
Hallo @ user1237981 die Antwort unten Hilfe tat? Oder war es unklar? Oder habe ich den Punkt vermisst, was Sie brauchen? –
Vielen Dank RIchard, es hat sofort funktioniert. Ich war im Urlaub und konnte nicht sofort antworten. – user1237981
Großartig! Vielen Dank. –