如何在 Slick 2.0 中计数(*)?
Posted
技术标签:
【中文标题】如何在 Slick 2.0 中计数(*)?【英文标题】:How to COUNT(*) in Slick 2.0? 【发布时间】:2014-02-26 06:31:39 【问题描述】:根据Slick 2.0 documentation, 获取表中的行数:
val q1 = coffees.length
// compiles to SQL (simplified):
// select count(1) from "COFFEES"
然而,coffees.length
的类型是 Column[Int]
。
如何执行查询并获取值?
【问题讨论】:
【参考方案1】:我刚刚升级到 slick 2.0 时遇到了同样的问题。我忘记了确切的方法在哪里,但通用的 .run
似乎对我有用,即
coffees.length.run
【讨论】:
由于某种原因,我无法使用此run
方法(我的数据库驱动程序可能缺少一个特征吗?)...但是,我能够让它像这样运行:scala.slick.lifted.Compiled(coffees.length).run
。如果有人知道我缺少什么以阻止较短的版本工作,请告诉我!
太棒了!谢谢! @ChrisW:你导入你的司机资料简单吗?
@KrzysztofKowalski:我可以发誓我 确实 导入了驱动程序 simple
模块中的所有符号,但无论如何,由于某种原因,更短的语法(@ 987654326@) 正在工作。
这行得通,但性能可能真的很差。请参阅下面我对@tuxSlayer 的评论。【参考方案2】:
StaticQuery.queryNA[Int]("select count(*) from \"" + TableName + "\"").first
如果您的表名不是大写,则需要引号。
【讨论】:
请注意,此查询可能比.length.run
替代方法快一个数量级。我的测试数据库有大约 180k 行,在我的计算机上,第一种方法大约需要 350 毫秒,StaticQuery 方法大约需要 30 毫秒,这与我从 mysql 控制台得到的大致相同。
是的,我对coffees.length.run
的查询计划有点糟糕。这么多嵌套查询:select x2.x3 from (select count(1) as x3 from (select x4.`updated_at` as x5, x4.`description` as x6, x4.`status` as x7) from `sales` x4) x19) x2
【参考方案3】:
尝试 coffees.length.first
应该执行并返回Int
抱歉,确实,在 slick 1.0 中有第一种方法可以做到这一点,在 Slick 2.0 中,他们摆脱了它,转而使用更通用的run
。
执行查询的函数是
coffees.length.run
【讨论】:
我之前尝试过,但是 Column[Int] 没有第一种方法。以上是关于如何在 Slick 2.0 中计数(*)?的主要内容,如果未能解决你的问题,请参考以下文章