在节点js的cassandra中插入BigInt

时间:2016-08-24 14:39:50

标签: node.js cassandra datastax

我在cassandra有一个非常简单的表。
姓名:测试

  • id(bigint,主键)
  • name(text)

我正在尝试使用nodejs(使用cassandra-driver)

将值插入到此值中
client.execute("insert into test (id, name) values (?, ?)", [123, "dskddjls"], function (err, response) {
            if (err) {
                console.log("An error occured, ", err)
                //...
            }
            else { 
                console.log("Added to table, ", response)
                //...
            }
        })

插入成功完成但是当我检查我的cassandra数据库时,看起来好像我有big int列的垃圾值。

enter image description here

为什么会发生这种情况的任何解释?

2 个答案:

答案 0 :(得分:3)

您需要明确指定类型作为execute函数的第三个参数:

client.execute("insert into test (id, name) values (?, ?)", [123, "dskddjls"], {hints: ["bigint", null]}, function (err, response) {
   ...
})

原因是对于某些字段,cassandra驱动程序无法猜测类型(如bigint或timestamp),因此您需要提示它。对于字符串或常规数字,它将在没有提示的情况下工作。

答案 1 :(得分:1)

CellFormatting中,您可以看到bigint的预期JavaScript类型为Long。 JavaScript Number类型为CQL datatypes to JavaScript types documentation,由驱动程序用于表示Cassandra intfloatdouble(默认)。

在您的情况下,如果要将应用程序中的值插入数字,则应使用Long.fromNumber()方法:

const query = "insert into test (id, name) values (?, ?)";
client.execute(query, [ Long.fromNumber(123), "my name" ], callback);

此外,为了准确映射JavaScript类型和Cassandra类型(以及其他好处),您应该double-precision 64-bit binary format IEEE 754 value。在您的情况下,如果您设置prepare标记,则驱动程序会识别出预期值为Long并从Number进行转换:

client.execute(query, [ 123, "my name" ], { prepare: true }, callback);