如何在 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 中计数(*)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hadoop 中计数? [复制]

在 Slick 2.0 中插入后返回 AutoInc ID

如何在 MySQL 中显示一个表中的所有行并从另一个表中计数

在 hive mapreduce 中计数 desc

在访问报告中计数

在 PySpark Dataframe 中计数零次出现