如何在 Cassandra 中插入行后获取生成的 Id
How to get generated Id after inserting row in Cassandra
我正在尝试插入一些共享行 ID 的行,并决定坚持使用基于时间的 uuid。我能找到的所有文档都解释了如何创建这样的行:
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?
这是一个与您的应用程序查询路径相关的问题。通常在 Cassandra 数据模型中,从用户如何获取一条信息到下一条信息,从一个查询到下一个查询,您采用自上而下的方法。
您的用户 table 创建后,需要通过该 "id" 列进行查询。如果您不确定您正在设置什么,您将如何取回它?
Cassandra 是一个 NoSQL 数据库。这并不意味着它不是关系型的。它具有您可以执行的关系。如果您没有生成您的 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+"');";
你可能会做那个清洁工,但你明白了。
您应该在查询参数中提供它,而不是依赖 CQL now()
函数(returns 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 驱动程序具有丰富的类型系统,您可以在此 table 中查看 CQL 类型到 JavaScript 类型表示:https://docs.datastax.com/en/developer/nodejs-driver/latest/features/datatypes/
我正在尝试插入一些共享行 ID 的行,并决定坚持使用基于时间的 uuid。我能找到的所有文档都解释了如何创建这样的行:
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?
这是一个与您的应用程序查询路径相关的问题。通常在 Cassandra 数据模型中,从用户如何获取一条信息到下一条信息,从一个查询到下一个查询,您采用自上而下的方法。
您的用户 table 创建后,需要通过该 "id" 列进行查询。如果您不确定您正在设置什么,您将如何取回它?
Cassandra 是一个 NoSQL 数据库。这并不意味着它不是关系型的。它具有您可以执行的关系。如果您没有生成您的 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+"');";
你可能会做那个清洁工,但你明白了。
您应该在查询参数中提供它,而不是依赖 CQL now()
函数(returns 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 驱动程序具有丰富的类型系统,您可以在此 table 中查看 CQL 类型到 JavaScript 类型表示:https://docs.datastax.com/en/developer/nodejs-driver/latest/features/datatypes/