cassandra 响应错误:密钥空间'ks1'不存在

y3bcpkx1  于 2022-12-23  发布在  Cassandra
关注(0)|答案(1)|浏览(146)

我是新的 cassandra 和刚刚安装,并希望尝试它。所以我尝试了以下代码:

import cassandra from 'cassandra-driver';

const client = new cassandra.Client({
  contactPoints: ['localhost'],
  localDataCenter: 'datacenter1',
  keyspace: 'ks1'
});

const query1 = "CREATE TABLE users(name text , emailtext, PRIMARY_KEY(email, name)) VALUES('someone' , 's@s.com')";
const query2 = 'SELECT name, email FROM users WHERE name = ?';

await client.execute(query1);

await client.execute(query2)
  .then(result => console.log('User with email %s', result.rows[0].email));

但我得到的结果是:

> cassandra_test@1.0.0 start
> ts-node-esm src/index.ts

/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/readers.js:389
    const err = new errors.ResponseError(code, message);
                ^
ResponseError: Keyspace 'ks1' does not exist
    at FrameReader.readError (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/readers.js:389:17)
    at Parser.parseBody (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/streams.js:209:66)
    at Parser._transform (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/streams.js:152:10)
    at Parser.Transform._write (node:internal/streams/transform:175:8)
    at writeOrBuffer (node:internal/streams/writable:392:12)
    at _write (node:internal/streams/writable:333:10)
    at Parser.Writable.write (node:internal/streams/writable:337:10)
    at Protocol.ondata (node:internal/streams/readable:766:22)
    at Protocol.emit (node:events:513:28)
    at Protocol.emit (node:domain:489:12) {
  info: 'Represents an error message from the server',
  code: 8704
}

问题是什么?我如何解决它?
PS:我使用的是Ubuntu 22. 04和NodeJS版本9。

bhmjp9jg

bhmjp9jg1#

因此ks1密钥空间不存在,您需要创建它。
你可以使用cqlsh工具(可以在Cassandra的bin/目录中找到),因为你的集群看起来像是一个本地节点,并且没有激活安全性,你应该可以简单地通过以下操作进入它:

$ bin/cqlsh

进入后,可以使用以下命令创建密钥空间:

CREATE KEYSPACE ks1 WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};

这是最快的解决办法。

    • 编辑**

在查看了CQL查询之后,也发现了一些错误。CREATE TABLE语句不允许在创建时插入值。因此,需要两个独立的查询:

const query1 = "CREATE TABLE users(name text , email text, PRIMARY KEY(email, name))"
const query1b = "INSERT INTO users (name,email) VALUES('someone' , 's@s.com')";

await client.execute(query1);
await client.execute(query1b);

注意,在CREATE TABLE语句中,我还更正了email textPRIMARY KEY之间的间距。
另外,query2看起来像是在使用问号?来绑定一个预准备语句中的变量,但我不知道这是在哪里发生的,当你了解这一点时,请查看Parameterized Queries上Node.js驱动程序的DataStax文档。
还要注意,按照这个表的PRIMARY KEY的结构,它只能通过emailemailname查询,但不能单独通过name查询。

相关问题