如何在cassandra中插入行后获得生成的id

ct3nt3jp  于 2021-06-10  发布在  Cassandra
关注(0)|答案(2)|浏览(364)

我试图插入一些共享行id的行,并决定使用基于时间的uuid。我能找到的所有文档都解释了如何创建这样一行:

INSERT INTO users (id, name) VALUES (now(), 'Florian')

我在用税务局的 cassandra-driver 让node.js执行我的查询(其中 insertUser 是包含上述查询的字符串):

var r = await client.execute(insertUser)
console.dir(r.rows)

结果如下:

ResultSet {
  info:
   { queriedHost: '127.0.0.1:9042',
     triedHosts: { '127.0.0.1:9042': null },
     speculativeExecutions: 0,
     achievedConsistency: 10,
     traceId: undefined,
     warnings: undefined,
     customPayload: undefined,
     isSchemaInAgreement: true },
  rows: undefined,
  rowLength: undefined,
  columns: null,
  pageState: null,
  nextPage: undefined }

如我们所见,结果中没有可以用来创建依赖行的id。
有没有一种cassandra惯用的方法可以根据同一个id创建多个行,而不生成本地id?

u3r8eeie

u3r8eeie1#

这是一个与应用程序查询路径相关的问题。一般来说,在cassandra数据模型中,您有一种自顶向下的方法,从用户如何获得一条信息到下一条信息,从一个查询到下一个查询。
您的users表在创建之后,需要通过“id”列进行查询。如果你不确定你设置的是什么,你将如何取回它?
cassandra是一个nosql数据库。这并不意味着这不是关系。它有你可以强制执行的关系。如果您没有生成您的id,或者没有以前的id,那么以后访问该数据的唯一方法就是使用扫描,这是不推荐的。
另一种方法可能是对“florian”字符串执行md5。md5字符串将是确定性的。

var input_name = "Florian";
var input_id = md5hash(input_name);

// interpolate the variables into a valid CQL using the values
var cql = "INSERT INTO users (id, name) VALUES ('"+input_id+"', '"+input_name+"');";

你也许可以做得更干净,但你明白了。

pvabu6sv

pvabu6sv2#

您应该在查询参数中提供它,而不是依赖于cql now() 函数(返回uuidv1)。

const cassandra = require('cassandra-driver');
const Uuid = cassandra.types.Uuid;

// ...
const query = 'INSERT INTO users (id, name) VALUES (?, ?)';
const id = Uuid.random();
const options = { prepare: true, isIdempotent: true };
const result = await client.execute(query, [ id, 'Florian' ], options);

从客户端生成id的另一个好处是它使您的查询是幂等的。
datastax驱动程序具有丰富的类型系统,您可以检查下表中的cql类型到javascript类型表示:https://docs.datastax.com/en/developer/nodejs-driver/latest/features/datatypes/

相关问题