我在尝试为我的应用程序实现一些计数器时遇到了这种奇怪的行为。基本上,我做了一个这样的计数器表:
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';
我得到适当的完整结果。因此:
我的临时解决方案是从system.schema_columns表中选择列名称和字符串。将所有这些都加入到我的SELECT查询中…
system.schema_columns
非常感谢您的帮助。
感谢安迪的帮助。
起初,我认为考虑到您告诉我的内容,我宁愿偶尔执行一次SELCT column_name操作,system.schema_columns并在更改表时刷新它。我只是strings.join()在那儿的列SELECT FROM api_counters。它可以正常工作,但是如果我有2个不同的实例,并且一个实例将更新架构,另一个实例将收到GET请求,则该实例仍然不知道新列。
SELCT column_name
strings.join()
SELECT FROM api_counters
然后,我重新整理了想法,发现显然还有另一种方法,我只是更改了此模式: CREATE TABLE stats_dev.api_counters ( date text, description text, all counter, PRIMARY KEY (date, description) ); 然后,我根据期望的描述更新了该字段。到目前为止,一切都很好。
CREATE TABLE stats_dev.api_counters ( date text, description text, all counter, PRIMARY KEY (date, description) );
我知道绝对是选项3:我的模式不是最好的模式。