簡體   English   中英

Scala,元組的 sql 插值

[英]Scala, sql interpolation for tuples

我有一個看起來像普通 sql 中的查詢

Select * from persons 
where (persons.first_name, persons.last_name) 
in (('a', 'b'), ('c', 'd'))

我正在嘗試從 Scala 中執行此操作

val names = List(("James", "hasi"), ("Michael", "Myers))
sql""" Select * from ${table}     where (first_name, last_name) IN ${names}""".stripMargin.map(...)

但是它失敗了,因為 scalikejdbc 不知道如何插入元組。

"PSQLException: Can't infer the SQL type to use for an instance scala.Tuple2"

知道如何實現這一目標嗎? 我想我總是可以將元組列表轉換為字符串,但問題是 Scala 會用單引號將其包裝起來,將所有內容都作為字符串處理。

我會將此作為答案發布,因為它以不同的方式解決了問題。 我最終在 scalikejdbc 中編寫了原始 SQL,而沒有轉義元組“名稱”

您可以通過使用 SQLSyntax 類來做到這一點

val a = SQLSyntax.createUnsafely(names)
sql"${a}" <- not escaped

嗨,我有兩個建議-

  1. 您是否嘗試過其他類型? 還是必須使用元組? 也許快速嘗試一個序列或一個集合等。

  2. 看起來您正在使用原始插值。 我不確定您正在使用的 API,但看起來您可能只想使用一個引號,例如 -

    sql"Select * from ${table} where (first_name, last_name) IN ${names}".stripMargin.map(...)

編輯:
你可以嘗試映射列表還是太hacky了? 類似於names.map((fname, lname) => sql""" Select * from ${table} where first_name = $fname and last_name = lname""".stripMargin).for(r <- rs) yield r

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM