TL; DR:我想創建一個純函數,它將返回一個在單個DBIOAction對象內關閉的插入操作序列(例如def foo() :DBIOAction)。當ID不自動增加時,這是微不足道的,當ID的ARE由DB自動遞增時,這對我很困難)。作爲單個DBIOAction關閉插入(返回autoinc id)序列
我一直在使用Slick多了一個星期了,我真正喜歡的是能夠關閉一系列操作作爲一個DBIOAction,可以通過我的函數返回,稍後可以作爲一個DB副作用。
當我將數據插入單個表格時,這一切都很好。但是,如果在我插入的第二行中必須使用一個插入行的ID(與任何一對多關係一樣),那麼我應該如何處理這種情況,因爲ID是自動遞增的?
想象一下,我們有一個CATEGORIES table
列:id, name, parent_id
,其中parent_id
是NULL或指向表中的其他行。
如果ID不自動增加的,這很簡單:
def insert(cId: Int, cName: String, subcId: Int, subcName: String) = DBIO.seq( categories +=(subcId, subcName, None), categories +=(cId, cName, Some(subcId)) )
但是,當ID爲自動incrememnted,這GET的棘手。 As stated in the documentation,我需要使用returning
與投影到柱需要被返回的,等組合:
val categoryId = (categories returning categories.map(_.id)) += (0, name, None)
現在我可以插入第二行使用時返回ID。真棒。但是,如何關閉數據庫操作序列,因爲我使用ID返回,而不是操作本身?
def insert(cName: String, subcName: String): DBIOAction[Int, Stream, Write] = ???
抱歉遲到的評論,但是代碼的最終版本是什麼?您是否需要在兩個調用中打破DBIO.seq(...)? – brunovianarezende