小编典典

gocql SELECT *不返回所有列

go

我在尝试为我的应用程序实现一些计数器时遇到了这种奇怪的行为。基本上,我做了一个这样的计数器表:

CREATE TABLE stats_dev.log_counters (
  date text PRIMARY KEY,
  all counter
);

然后,我也想计算一些特定类型的消息,因此在Go应用程序中,我更改了表以添加以前没有的列。

我的应用程序正在增长,并且我开始有30列以上(不应超过50列),并且当我想检索所有这些计数器时,结果中缺少一些列。

query := s.Query(`SELECT * FROM `+_apiCountersTable+` WHERE date IN ?`, dates)
res, err := query.Iter().SliceMap()

这给我返回了30列超过34列的信息。虽然,当我在CQLSH上执行请求时:

cqlsh:stats_dev> SELECT * FROM api_counters WHERE date = 'total';

我得到适当的完整结果。因此:

  1. 这是否来自我的要求,应该有所不同?
  2. 可能来自gocql驱动程序吗?
  3. 这种模式完全愚蠢吗?

我的临时解决方案是从system.schema_columns表中选择列名称和字符串。将所有这些都加入到我的SELECT查询中…

非常感谢您的帮助。


阅读 397

收藏
2020-07-02

共1个答案

小编典典

感谢安迪的帮助。

起初,我认为考虑到您告诉我的内容,我宁愿偶尔执行一次SELCT column_name操作,system.schema_columns并在更改表时刷新它。我只是strings.join()在那儿的列SELECT FROM api_counters。它可以正常工作,但是如果我有2个不同的实例,并且一个实例将更新架构,另一个实例将收到GET请求,则该实例仍然不知道新列。

然后,我重新整理了想法,发现显然还有另一种方法,我只是更改了此模式: CREATE TABLE stats_dev.api_counters ( date text, description text, all counter, PRIMARY KEY (date, description) );
然后,我根据期望的描述更新了该字段。到目前为止,一切都很好。

我知道绝对是选项3:我的模式不是最好的模式。

2020-07-02