Как получить сгенерированный идентификатор после вставки строки в Cassandra - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь вставить вставить несколько строк с идентификатором строки и решил придерживаться основанных на времени uuids.Вся документация, которую я смог найти, объясняла, как создать такую ​​строку:

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

Я использую DataStax's 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 }

Как мы видим, идентификатора нетв результате, который я мог бы использовать для создания зависимых строк.

Существует ли идиоматический способ Кассандры для создания нескольких строк в зависимости от одного и того же идентификатора без генерации идентификатора local?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Вы должны указать это в параметре запроса, а не полагаться на функцию 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);

Дополнительным преимуществом генерации идентификатора на стороне клиента является то, что он делает ваш запрос идемпотентным .

Драйвер DataStax имеет богатую систему типов, вы можете проверить представление типов CQL в JavaScript в этой таблице: https://docs.datastax.com/en/developer/nodejs-driver/latest/features/datatypes/

0 голосов
/ 14 марта 2019

Этот вопрос связан с путем запроса вашего приложения. Как правило, в модели данных Cassandra у вас есть подход «сверху вниз» от того, как пользователь переходит к одному фрагменту информации, к следующему, от одного запроса к другому.

Ваша таблица пользователей после ее создания должна будет запрашиваться этим столбцом «id». Если вы не уверены, что именно настраиваете, как вы собираетесь вернуть его обратно?

Cassandra - это база данных NoSQL. Это не значит, что он не реляционный. У него есть отношения, которые вы можете навязать. Если вы не генерируете свой идентификатор или не имеете его ранее, единственный способ получить доступ к этим данным позже - это использовать сканирование, что не рекомендуется.

Другой подход может заключаться в том, чтобы сделать MD5 из строки "Florian". Эта строка 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+"');";

Возможно, вы могли бы сделать это чище, но вы получите картину.

...