连接Datastax Astra DB后如何保持返回响应的数据类型不变
问题原因
- Datastax Astra v2 版本的REST API默认会对浮点类型(float、double)做序列化处理:为了规避不同编程语言解析浮点数时的精度损失问题,接口默认将所有浮点类型字段序列化为字符串返回,仅整数类型字段会保留原始数值格式,该行为和表结构定义、CSV上传环节的配置无关。
- 你当前调用的查询接口未开启保留原始数值类型的参数,触发了默认的序列化逻辑,因此出现float字段返回为字符串的情况。
解决方案
你可以根据业务场景选择以下任意一种方案解决:
- 方案1:添加请求参数开启原始数值返回
在请求路径后追加raw=true查询参数即可让接口直接返回原始float类型,修改后的代码示例:
注意该方案可能存在多语言浮点数解析的精度偏差风险,对数据精度要求极高的业务不推荐使用。res = astra_client.request( method=http_methods.GET, path=f"/api/rest/v2/keyspaces/{ASTRA_DB_KEYSPACE}/{ASTRA_DB_COLLECTION}/rows?raw=true") - 方案2:响应返回后手动做类型转换
预先定义好浮点类型字段的映射规则,拿到响应结果后遍历转换即可,该方案兼容性最好、无精度风险,代码示例:# 定义所有需要转换为float的字段 float_field_list = ["PetalWidthCm", "PetalLengthCm", "SepalWidthCm", "SepalLengthCm"] # 遍历处理返回的每行数据 converted_rows = [] for item in res.json(): temp_item = item.copy() for field in float_field_list: if field in temp_item and type(temp_item[field]) == str: temp_item[field] = float(temp_item[field]) converted_rows.append(temp_item) - 方案3:替换为官方Python驱动查询
若无需强制使用REST接口,可切换为Astra官方适配的Cassandra Python Driver做数据查询,驱动会自动匹配CQL定义的数据类型返回,无需额外做类型转换处理。
内容的提问来源于stack exchange,提问作者Pritam Sinha
相关产品推荐
相关产品推荐

