Cassandra入门报错排查:Keyspace不存在及建表语法错误
Cassandra新手测试代码的错误排查与修复
问题1:ResponseError: Keyspace 'ks1' does not exist
错误原因
代码初始化Cassandra客户端时配置了keyspace: 'ks1',但该keyspace并未在Cassandra集群中创建,客户端连接时找不到对应资源,因此抛出错误。
修复方法
需先创建目标keyspace,再执行后续的表操作。可以在代码中先执行创建keyspace的语句,或通过cqlsh手动创建。
修正后代码示例(包含keyspace创建):
import cassandra from 'cassandra-driver'; // 初始化客户端时暂不指定keyspace const client = new cassandra.Client({ contactPoints: ['localhost'], localDataCenter: 'datacenter1' }); // 创建keyspace(IF NOT EXISTS避免重复创建报错) const createKeyspaceQuery = "CREATE KEYSPACE IF NOT EXISTS ks1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}"; await client.execute(createKeyspaceQuery); // 切换到目标keyspace client.keyspace = 'ks1'; // 表创建、数据插入与查询语句 const query0 = "CREATE TABLE IF NOT EXISTS users(name text, email text, PRIMARY KEY (email, name))"; const query1 = "INSERT INTO users(name, email) VALUES ('someone' , 's@s.com')"; const query2 = "SELECT name, email FROM users WHERE name = ?"; await client.execute(query0); await client.execute(query1); const result = await client.execute(query2, ['someone']); console.log('User with email %s', result.rows[0].email);
问题2:ResponseError: line 1:53 no viable alternative at input '('
错误原因
修改后的CREATE TABLE语句存在两处语法问题:
- 主键定义错误:
PRIMARY_KEY(email, name)不符合CQL规范,正确写法为PRIMARY KEY (email, name)(关键字无下划线,且与括号间需有空格) - SELECT语句错误:
WHERE name = someone中,字符串类型的条件值未加单引号,或未使用参数化查询
修复方法
- 修正CREATE TABLE的主键语法
- 修正SELECT语句的条件值写法(推荐用参数化查询避免注入风险)
修正后的关键语句:
// 正确的表创建语句 const query0 = "CREATE TABLE IF NOT EXISTS users(name text, email text, PRIMARY KEY (email, name))"; // 正确的参数化查询语句 const query2 = "SELECT name, email FROM users WHERE name = ?"; // 执行时传入参数 const result = await client.execute(query2, ['someone']);
内容的提问来源于stack exchange,提问作者best_of_man
相关产品推荐
相关产品推荐

