NodeJS 持续时间列类型作为自定义类型返回

des4xlb0  于 2023-05-22  发布在  Node.js
关注(0)|答案(1)|浏览(111)

我在Cassandra中有以下表格:

create table duration_table
(
    id           int primary key,
    duration_col duration
);

Cassandra DB version is 4.0.5cassandra nodejs driver version is 4.6.4 .通过请求表元数据时

client.metadata.getTable(keyspaceName, "duration_table")

结果是:

...,
{
  ...,
  columns: [
    ...,
    {
      "name": "duration_col",
      "type": {
        "code": 21,
        "info": null,
        "options": {
          "frozen": false
        }
      },
      "isStatic": false
    }
  ]
}

duration_col返回的类型代码是21,对应于types.dataTypes.duration enum in cassandra-driver。但是,当我通过Cassandra驱动程序客户端发送以下请求时:

client.execute("SELECT * FROM duration_table");

结果如下:

{
  ...,
  columns: [
    ...,
    {
      "name": "duration_col",
      "type": {
        "code": 0,
        "type": null,
        "info": "org.apache.cassandra.db.marshal.DurationType"
      }
    }
  ]
}

这里返回的类型是0,它对应于驱动程序中的types.dataTypes.custom枚举。我的问题是

  • 为什么在同一个表和同一列上的类型不同?
  • 是否保证在这种情况下,返回的ResultSet中的值为org.apache.cassandra.db.marshal.DurationTypeinfo字段将始终存在?我的意思是,我可以将此字段视为持续时间列类型的常量吗?
  • 是否有其他cassandra类型作为自定义类型返回,但实际上它们不是自定义类型?
wqnecbli

wqnecbli1#

感谢您的提问!
您将看到结果集中的列元数据将duration类型报告为自定义类型,因为您正在连接中使用协议版本4。duration类型作为协议版本5(v5)完全支持的类型被添加到CQL协议中,但不幸的是,nodejs驱动程序目前仅支持协议版本4(v4)或更低版本。您可以通过在日志顶部附近查找以下内容来查看nodejs驱动程序与v4的连接:

info - Connection:  Protocol version 5 not supported by this driver, downgrading (undefined)

当你连接到一个支持duration类型的Cassandra服务器时,服务器会自动将duration类型转换为自定义类型,以给予你的驱动程序可以理解的东西。您可以通过向测试表中添加一行数据并打印查询结果集来确认这一点:

ResultSet {
...
rows: [
 Row {
   id: 1,
   duration_col: Duration {
     months: 0,
     days: 0,
     nanoseconds: Long { low: -129542144, high: 13, unsigned: false }
   }
 }
],
rowLength: 1,
columns: [
 { name: 'id', type: { code: 9, type: null } },
 {
   name: 'duration_col',
   type: {
     code: 0,
     type: null,
     info: 'org.apache.cassandra.db.marshal.DurationType'
   }
 }
],
...

请注意,在本例中,duration列中的返回值被正确地呈现为三倍值,其中包括一定数量的月、天和纳秒。这与v5规范中定义的持续时间值完全匹配,因此很明显,该列中存储的是持续时间数据。
这里有一个关于nodejs驱动程序如何在不支持v5的情况下识别持续时间类型的快速说明。驱动程序添加了对其他工作的持续时间类型的支持。对这种类型的支持对于实现v5是必要的,但这肯定是不够的; v5不仅仅是一种新的数据类型。
请注意,当我们向Ruby驱动程序添加对duration类型的支持时,我们正好遇到了这个问题;这就是这个评论所指的。

相关问题