gpt4 book ai didi

scala - Scala Slick如何将Scala代码转换为JDBC?

转载 作者:行者123 更新时间:2023-12-03 13:16:40 25 4
gpt4 key购买 nike

Slick如何翻译代码,例如:

val q2 = for {
c <- Coffees if c.price < 9.0
s <- Suppliers if s.id === c.supID
} yield (c.name, s.name)
for(t <- q2) println(" " + t._1 + " supplied by " + t._2)


进入JDBC?

它是否使用Scala虚拟化?是否使用其他方法?

最佳答案

Slick的稳定API通过所谓的提升嵌入来实现此目的。您的示例显然是使用稳定的API(因为您将===用于相等性而不是==)。

Slick(以及Scala)的优点在于-无需使用宏或Scala-Virtualized即可实现这一目标。 (侧面注意:Slick的实验性API确实使用了宏-这样您就可以使用==代替===is

使用以下方法可以实现SQL的转换:


Scala的for理解语法,可转换为方法调用。
Slick中定义的表格是Monad,它们具有神奇的foreachmap
flatMap,以及
filter方法,可让它们在Scala中以for'loops'表示
将它们转换为方法调用(如代码中正确所示)
the other answer by @emil-ivanov提供)。

与常规Scala集合一样,for是嵌套的语法糖
方法调用flatMap / mapfilter;不像常规收藏
Scc Table对象的mapfilter版本返回表示形式
查询,将其与每个过滤条件(if)或联接一起构建
(如s <- Suppliers if s.id is c.supID中所示)

因此,q2的类型不是您通常的收藏(对于Scala中的理解
通常用于返回),而是查询的表示形式。
(就像Scala Option Monad也可以使用for理解一样
不是“集合”(以ListMap的方式)

您可以使用q2.selectStatement查看基础查询。
Scala的隐式提升-c.price不是Int而是表示
列值-因此表达式c.price < 9.0变为c.price.<(Const(9.0))
(将Int提升为所需的类型),而<只是该方法的一种
表示c.price的类。 Column方法
不执行<通常执行的操作(对于普通<而言)-它仅返回
对应于Int的SQL AST的表示形式,该表示形式成为
生成并发送给JDBC执行的SQL。


就细节而言,还有很多其他事情,但是我认为查询monad和隐式提升是主要因素。

关于scala - Scala Slick如何将Scala代码转换为JDBC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13758445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com