I have a script below and I am trying to use DBlick slick actions to achieve it.
Execute a batch Insert operation. On success, return the inserted result On failure, -> if the failure is due to duplicate value in a particular column, then remove the duplicates from the list, and try batch insert again. If the second batch insert is successful, return a successful future with the second inserted list, else the failed future of the 2nd batch insert. -> if the failure is due to something else, then throw that exception
In the above script, I tried using the cleanUp action. But I donβt know how to return the result of cleanUp actions if the main action failed.
How can I fulfill my requirement with DBIO error handling?
def insertBatchAndReturnQuery(rowList: List[E]): FixedSqlAction[Seq[E], NoStream, Write] = { query returning query ++= rowList } def insert(entities: List[E]): Future[Seq[E]] = { val q = insertBatchAndReturnQuery(entities).cleanUp { case Some(ex) => ex match { case b: PSQLException => { if (b.getSQLState.equals("23505")) { //unique key exception, handle this by removing the duplicate entries from the list ??? } else { throw new Exception("some database exception") } } } case None => insertBatchAndReturnQuery(Nil) } db.run(q) }
Here the query is TableQuery [T].
Slick Version: 3.2.0-M2
source share