2015-07-13 38 views
0

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] = ???

回答

1

所以我會回答我的問題是有人可能會覺得很奇怪,在第一次和我一樣。

val categoryId = (categories returning categories.map(_.id)) += (0, name, None)

訣竅是,categoryId也是DBIOAction,不是int,因爲我原先預期的那樣。微不足道,但你去了。

+0

抱歉遲到的評論,但是代碼的最終版本是什麼?您是否需要在兩個調用中打破DBIO.seq(...)? – brunovianarezende

0

這是我會怎麼做(我已經做在我的一個項目類似的東西):

def insert(cName: String, subcName: String) = { 
    for { 
    id <- (categories returning categories.map(_.id)) += (subcName, None) 
    _ <- categories +=(cName, Some(id)) 
    } yield() 

,然後我會打電話的功能等:

db.run(insert(categoryName, subCategoryName))