我在cassandra有一个非常简单的表。
姓名:测试
列:
我正在尝试使用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列的垃圾值。
为什么会发生这种情况的任何解释?
答案 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 int
,float
和double
(默认)。
在您的情况下,如果要将应用程序中的值插入数字,则应使用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);