如何在Cassandra中插入行后生成Id

问题描述 投票:1回答:2

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

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

我正在使用DataStax's cassandra-driver for 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本地?

node.js cassandra row cql3
2个回答
2
投票

您应该在查询参数中提供它,而不是依赖于CQL now()函数(它返回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的额外好处是它使您的查询idempotent

DataStax驱动程序具有丰富的类型系统,您可以在此表中查看CQL类型到JavaScript类型的表示形式:https://docs.datastax.com/en/developer/nodejs-driver/latest/features/datatypes/


0
投票

这是一个与您的应用程序查询路径相关的问题。通常在Cassandra数据模型中,从一个查询到下一个查询,您可以从用户获取信息到下一个信息的方式采用自上而下的方法。

您的用户表在创建之后,需要通过该“id”列进行查询。如果你不确定你的设置是什么,你将如何取回它?

Cassandra是一个NoSQL数据库。这并不意味着它不是关系型的。它具有您可以强制执行的关系。如果您没有生成您的ID,或者之前没有生成您的ID,则以后访问该数据的唯一方法是使用扫描,这是不推荐的。

另一种方法是可能做一个“弗洛里安”字符串的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+"');";

你可能会做得那么干净,但你得到的照片。

© www.soinside.com 2019 - 2024. All rights reserved.