首页 > 解决方案 > 在 Cassandra 中插入行后如何获取生成的 ID

问题描述

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

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

我正在使用Node.js的 DataStaxcassandra-driver来执行我的查询(其中包含来自上面的查询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?

标签: node.jscassandrarowcql3

解决方案


您应该在查询参数中提供它,而不是依赖 CQLnow()函数(返回 UUID v1)。

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/


推荐阅读