【问题标题】:How to get the number of rows returned by a query using gocql如何使用 gocql 获取查询返回的行数
【发布时间】:2020-08-25 00:38:08
【问题描述】:

我正在使用此处记录的 gocql 库:https://godoc.org/github.com/relops/cqlc/cqlc#Fetchable 并尝试在 golang 中编写一个 API 调用,该调用将询问我的数据库中满足特定字段的所有元素并返回元素总数回来。我知道当我在 Cassandra 界面中时,我可以使用调用 SELECT COUNT(*) from table1 WHERE ...; 其中 table1 是表名。我一直在阅读文档,我能找到的只是限制返回条目数量的限制函数。

例如,假设我在 Cassandra 中有一个在不同日期发生的事件的数据库表。我只想返回星期二发生的事件的数量,并且我想使用 gocql 来执行此操作。

目前我正在做类似的事情:

cx := cqlc.NewContext()
iter, err := cx.Select().
            From(db.EVENTLOG).
            Where(db.EVENTLOG.DAY.Eq(day).
            Limit(10000).       
            Fetch(cass)
data, err = db.BindEventlog(iter)

BindEventLog 函数返回在“一天”发生的事件的数组,但同样,我只想要事件的数量,而不是事件本身。有没有办法在不遍历这个数组的情况下得到这个,因为无论如何我都会扔掉这个数组,所以让数据库给我整个数据数组真的很慢。

我是这方面的初学者,所以如果您需要更多信息,请询问,我试图尽可能具体。谢谢。

【问题讨论】:

  • 我在 API 中根本看不到任何聚合支持。 =/

标签: go cassandra gocql


【解决方案1】:

我能找到的最能帮助你的是Iter.NumRows

如果他们对行进行分页,则无法为您提供所需内容。如果他们这样做,这是在他们的 Github 上请求的合理功能。

【讨论】:

  • 谢谢,我也看到了 NumRows 的东西,但我不想重复。我已经联系了开发商。我要求这个功能。
  • @user6407048 你找到解决方案了吗?我目前正在调查它。我希望获取查询的总行数。
【解决方案2】:

你可以这样做

var count string
iter := session.Query(`SELECT count(*) FROM tablename`).Iter()
for iter.Scan(&count) {
    print(count)
}

您将在 count 变量中获得计数。

【讨论】:

  • 为什么计数是字符串类型的?
【解决方案3】:

我更喜欢:

var count int
tc.Session.Query(`SELECT COUNT(*) FROM ks.tbl WHERE something = ? ALLOW FILTERING`, "something_else").Iter().Scan(&count)
print(count)

因为计数将由数据库本身执行,而不是由应用程序执行。灵魂的答案也可以,但我更喜欢将计数保存为整数并直接扫描而不是额外的循环

【讨论】:

    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多