【问题标题】:Insert BigInt in cassandra from node js从节点 js 在 cassandra 中插入 BigInt
【发布时间】:2016-12-31 18:28:51
【问题描述】:

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

  • id(bigint,主键)
  • 姓名(文字)

我正在尝试使用 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 数据库时,似乎我有大 int 列的垃圾值。

对为什么会发生这种情况有任何解释吗?

【问题讨论】:

  • 能否尝试明确指定类型:client.execute("insert into test (id, name) values (?, ?)", [123, "dskddjls"], {hints: ["bigint", null]}, function (err, data) {.... })
  • @VsevolodGoloviznin 是的,这行得通。那么我们需要明确指定类型吗?

标签: node.js cassandra datastax


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

CQL datatypes to JavaScript types documentation 中,您可以看到bigint 的预期JavaScript 类型是Long。 JavaScript Number 类型是 double-precision 64-bit binary format IEEE 754 value,驱动程序使用它来表示 Cassandra intfloatdouble(默认)。

在您的情况下,如果您想在应用程序中插入一个值作为数字,您应该使用Long.fromNumber() 方法:

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

此外,为了在 JavaScript 类型和 Cassandra 类型之间进行准确映射(以及其他好处),您应该 prepare your queries。在您的情况下,如果您设置 prepare 标志,驱动程序将识别出预期值是 Long 并从 Number 进行转换:

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

【讨论】:

  • 真的!另一种解决方法:) 虽然,准备语句可能并不总是有效
猜你喜欢
  • 2015-12-31
  • 2012-02-05
  • 1970-01-01
  • 2021-07-02
  • 2019-05-25
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多