Cassandra "no viable alternative at input"

38

我正在尝试向表格中插入一行。有人可以指出这里发生了什么吗?

CREATE TABLE recommendation_engine_poc.user_by_category (
        game_category text,
        customer_id text,
        amount double,
        game_date timestamp,
        PRIMARY KEY (game_category, customer_id)
    ) WITH CLUSTERING ORDER BY (customer_id ASC)
        AND bloom_filter_fp_chance = 0.01
        AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
        AND comment = ''
        AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 864000
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99.0PERCENTILE';

    cqlsh:recommendation_engine_poc> insert into user_by_category  ('game_category','customer_id') VALUES ('Goku','12') ;
    SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:31 no viable alternative at input 'game_category' (insert into user_by_category  (['game_categor]...)">

5
在重新检查时,每个开发人员都有可能忽略一个错误,那就是单引号或双引号的使用!!! - Suhail Mumtaz Awan
3个回答

31

语法错误。这是正确的:

insert into user_by_category (game_category, customer_id) VALUES ('Goku', '12');

或者:

insert into user_by_category ("game_category", "customer_id") VALUES ('Kakarot', '12');

第二个通常用于区分大小写的列名。


可以提供这个在哪里有记录吗?http://docs.datastax.com/en//cql/3.0/cql/cql_reference/insert_example_t.html 这里的示例是错误的。 - Adelin
1
在你提供的示例中,列名没有用单引号/双引号标记。在这里:http://stackoverflow.com/questions/20332462/insert-into-column-family-with-case-sensitive-column-name 我看到了双引号标记,但是我找不到相关的文档说明。 - piotrwest

3

当使用占位符(无论是为准备语句,还是只使用字典填充值)时,可能会出现另一个问题:你放入字典中的任何内容都可能不会评估为像 int、str 等这样的简单类型。在我的情况下,这发生在 IntEnum 上,它显示为 <MyIntEnum.CONSTANT: 4> 而不是 4,但任何复杂对象都可能出现类似于 <object object at 0x7fbf08a0bdf0> 的情况。

因此,如果你使用以下形式:

session.execute(
        INSERT INTO table (id, name)
        VALUES (%(id)s, %(name)s),
        {"id": 123456, "name": "example"}
)

请确保字典中的每个元素都是字符串、整数、浮点数等类型。 这并不是本问题的原因,但由于这是有关此问题的第一个谷歌搜索结果,我希望能帮到其他人 :)

2
这个问题有两个原因:
  1. 使用双引号(")而不是单引号(')
  2. 在IN命令中,将值和回车键放在同一行
  3. 字符编码
因此,在使用IN命令等过滤器时,应该将命令写成单行,例如:
Select column from database where column_name IN('xyz','yzx')
而不应该写成多行形式:
Select column from database where column_name IN('xyz',
'yzx')
请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接