2017-01-23 44 views
0

有人問我光滑如何階確定哪些行需要更新給這個代碼如何階光滑determin該行此查詢更新

 def updateFromLegacy(criteria: CertificateGenerationState, fieldA: CertificateGenerationState, fieldB: Option[CertificateNotification]) = { 
     val a: Query[CertificateStatuses, CertificateStatus, Seq] = CertificateStatuses.table.filter(status => status.certificateState === criteria) 
     val b: Query[(Column[CertificateGenerationState], Column[Option[CertificateNotification]]), (CertificateGenerationState, Option[CertificateNotification]), Seq] = a.map(statusToUpdate => (statusToUpdate.certificateState, statusToUpdate.notification)) 
     val c: (CertificateGenerationState, Option[CertificateNotification]) = (fieldA, fieldB) 
     b.update(c) 
     } 

上面的代碼(在我看來)

  • 一)尋找,在有「標準」的「certificateState」
  • 二)所述柱體創建
  • 下的查詢)的所有行用我想要更新的值創建

然後查詢用於查找元組需要應用的行。

背景

不知是光滑的跟蹤行的標識的更新。

我想找出

  • 發生了什麼事封面的背後是什麼?
  • 什麼是「val a:查詢[證書狀態,證書狀態,Seq]中的Seq」
  • 有人可能會指出移動部件所在的光滑源?

回答

1

好的 - 我重新格式化了您的代碼,以便於在此處查看並將其分成塊。讓我們通過這一個接一個:

val a: Query[CertificateStatuses, CertificateStatus, Seq] = 
     CertificateStatuses.table 
      .filter(status => status.certificateState === criteria) 

上面是一個查詢,大致翻譯沿着這些路線的東西:

SELECT * // Slick would list here all your columns but it's essiantially same thing 
FROM certificate_statuses 
WHERE certificate_state = $criteria 

下面這個查詢被映射也就是說,有適用於SQL投影它:

val b: Query[ 
     (Column[CertificateGenerationState], Column[Option[CertificateNotification]]), 
     (CertificateGenerationState, Option[CertificateNotification]), 
     Seq] = a.map(statusToUpdate => 
      (statusToUpdate.certificateState, statusToUpdate.notification)) 

所以不是*你會有這樣的:

SELECT certificate_status, notification 
FROM certificate_statuses 
WHERE certificate_state = $criteria 

而最後一部分重複使用此構造查詢來執行更新:

val c: (CertificateGenerationState, Option[CertificateNotification]) = 
     (fieldA, fieldB) 

    b.update(c) 

翻譯爲:

UPDATE certificate_statuses 
SET certificate_status = $fieldA, notification = $fieldB 
WHERE certificate_state = $criteria 

據我瞭解,最後一步可能是,其他人有點少直接,但是這是本質你如何使用Slick進行更新(here - 雖然它是一元版本)。

至於你的問題:

發生了什麼事封面的背後?

這實際上在我的專業領域之外。這是說,它是相對簡單的代碼片段,我想更新轉換可能會有一些利益。我在這個答案的末尾提供了一個鏈接到相關的Slick消息來源。

什麼是序列中的 「VAL一個:查詢[CertificateStatuses,CertificateStatus,SEQ]」

它是集合類型。查詢指定3個類型參數:

  • mixed type - 表華而不實的代表(或列 - Rep

  • unpacked type - 鍵入執行查詢

  • collection type後得到 - 集合類型均高於unpacked type作爲查詢的結果,它們將被放置在您的面前。

所以有一個例子:

  • CertificateStatuses - 這是你的油滑表定義

  • CertificateStatus這是你的測試用例類

  • Seq - 這是怎麼了你結果將被檢索(它基本上是Seq[CertificateStatus]

我她解釋一下這裏:http://slides.com/pdolega/slick-101#/47(3下一個幻燈片或左右)

能有人也許指出其中的運動部件位於光滑源?

我覺得這部分可能有興趣 - 它顯示的查詢是如何轉換的更新語句:https://github.com/slick/slick/blob/51e14f2756ed29b8c92a24b0ae24f2acd0b85c6f/slick/src/main/scala/slick/jdbc/JdbcActionComponent.scala#L320

可能還值得強調的是:

我不知道是浮油跟蹤要更新的行的ID。

它沒有。查看生成的SQL。您可以通過添加以下配置到你的日誌看他們(但你也有他們在這個答案):

<logger name="slick.jdbc.JdbcBackend.statement" level="DEBUG" />

(我假定logback以上)。