2015-11-06 56 views
1

在Slick中,有firstfirstOption選擇結果集的第一行。我可以在Slick中選擇單行嗎?也可以保證它是唯一返回的行嗎?

是否有一個版本,也保證這是唯一的行被返回(以便我得到一個異常,如果數據集以某種方式打破我的應用程序依賴某些假設)?

+1

不知道你是否正在尋找能夠在數據庫運行之前驗證操作的東西(這是不可能的,據我所知),或者當你的電話給你其他的東西時會給你一個錯誤比預期受影響的行數。如果是後者,您可能需要查看[activeslick的'DBIOExtensions'](https://github.com/strongtyped/active-slick/blob/23dd36020bedb79a4c86683324b34c87eb140f05/modules/core/src/main/scala/io/strongtyped /active/slick/DBIOExtensions.scala#L8) –

+0

@SeanVieira:後者。我希望與許多其他ORM解決方案提供的相同功能來選擇單個行(選擇2,檢查只有1個,如果太多,則出錯) – Thilo

回答

2

我不知道有什麼內置的做到這一點。你可以做的是編寫一個方法,它會採取一個行動,檢查結果只是一行,如果沒有結果,就會失敗。

這可能只是一個簡單的舊方法,你繞行動。或者,我們可以豐富一個動作,使其成爲您在動作上的一個呼叫。下面是這種事情我的意思的例子:

implicit class ResultEnrichment[T](action: DBIO[Seq[T]]) { 
    def exactlyOne: DBIO[T] = action.flatMap { xs => 
    xs.length match { 
     case 1 => DBIO.successful(xs.head) 
     case n => DBIO.failed(new RuntimeException(s"Expected 1 result, not $n")) 
    } 
    } 
} 

該類被標記爲隱含的,因此編譯器可以利用它,只要有一個DBIO[Seq[T]]。具體而言,它提供exactlyOne方法,編譯器可以在Seq[T]的任何操作中找到該方法。

exactlyOne的結果是您可以運行的新操作。如果在運行時找不到一行,它將會失敗。

你會使用這樣的一些任意的查詢:

val query = table.filter(...).map(...) // whatever your query is 
val action = query.result.exactlyOne 

運行的是最後action,你會得到一個結果或在運行時錯誤。

相關問題