【问题标题】:How to get generated Id after inserting row in Cassandra在 Cassandra 中插入行后如何获取生成的 ID
【发布时间】:2019-08-04 13:12:03
【问题描述】:

我正在尝试插入一些共享行 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?

【问题讨论】:

    标签: node.js cassandra row cql3


    【解决方案1】:

    您应该在查询参数中提供它,而不是依赖 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/

    【讨论】:

    • 顺便说一句,有一个更新的uuid函数。
    【解决方案2】:

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

    您的 users 表在创建后需要通过该“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+"');";
    

    你可能会做的更清洁,但你明白了。

    【讨论】:

    • 谢谢你的回答,我知道 Cassandra 是一个基于行的数据库。我想我表达的太含糊了——我想创建一个行并使用 Cassandras 的能力来生成那个 id。然后我想使用该 id 来模拟与其他非规范化行的关系。但是,如果我没有取回它,我应该如何假设服务器端生成的 id?
    • 我明白了。任何框架中的建议都是相同的。生成它然后使用它。 C* 会将它放在正确的位置。 docs.datastax.com/en/developer/nodejs-driver/3.5/features/…
    猜你喜欢
    • 2011-07-21
    • 2018-04-19
    • 2016-05-28
    • 2014-12-22
    • 2013-10-06
    • 2011-04-03
    • 2019-12-10
    • 2019-11-21
    • 2010-11-23
    相关资源
    最近更新 更多