2017-02-07 20 views
6

Tôi có kịch bản dưới đây và tôi đang cố gắng sử dụng các hành động DBIO trơn tru để đạt được nó.Xử lý lỗi hoạt động dọn dẹp trong các hành động dbio trơn tru

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 

Đối với trường hợp trên, tôi đã thử sử dụng tác vụ dọn dẹp. Nhưng, tôi không biết cách trả về kết quả hành động cleanUp nếu hành động chính không thành công.

Làm cách nào để tôi có thể đạt được yêu cầu của mình khi xử lý Lỗi hành động DBIO?

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) 
    } 

Ở đây, truy vấn là TableQuery [T].

Version Slick: 3.2.0-M2

Trả lời

0

Bạn có thể nhìn thấy từ chữ ký cho cleanUp rằng nó sẽ trả về một hành động có giá trị của các loại tương tự như hành động đầu tiên, vì vậy không có cách nào bạn sẽ có thể trả về giá trị từ hành động cleanUp.

Nếu bạn muốn trả lại giá trị thứ hai, bạn cần phải bọc lỗi của mình trong một Try, sử dụng asTry và sau đó sử dụng flatMap. Đối với các vấn đề trong tầm tay, nó sẽ giống như thế này:

val q = insertBatchAndReturnQuery(entities).asTry.flatMap { 
    case Failure(b: PSQLException) if b.getSQLState == "23505" => 
    //unique key exception, handle this 
    //by removing the duplicate entries from the list 
    ??? 
    case Failure(e) => 
    throw new Exception("some database exception") 
    case Success(count) => DBIO.successful(count) 
} 

Tuy nhiên tài liệu cảnh báo rằng việc sử dụng asTry mất năng lực trực tuyến, vì vậy bạn có thể muốn tìm một cách khác để làm điều này ...

Các vấn đề liên quan