You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cassandra Python驱动查询结果替换列名特殊字符如何禁用

问题背景

使用cassandra-python-driver 3.25.0连接Cassandra 4.0.4查询数据时,建表阶段通过双引号包裹的含空格、%等特殊字符的列名(例如"Mem Util %"),在session.execute()返回的默认Row结果中会被自动修改:空格被替换为下划线,%等特殊字符被移除,例如"Mem Util %"会变为Mem_Util,无法获取原始列名。
环境版本信息:

[cassandra-driver (3.25.0)] 
[cqlsh 6.8.0 | Cassandra 4.0.4 | CQL spec 3.4.5 | Native protocol v4]
原因

驱动默认返回的Row对象是Python内置namedtuple类型,Python语法强制要求namedtuple的字段名必须为合法标识符(仅支持字母、数字、下划线,且不能以数字开头),因此驱动会自动清洗返回列名中的非法字符,保证row.字段名的属性访问方式可正常运行。
session.execute()方法本身没有提供配置项可以关闭该列名清洗逻辑,该限制来自Python底层语法规则,不是驱动可配置的行为。

解决方法

将session的行工厂替换为内置的dict_factory,查询结果会以Python字典格式返回,字典的key会完整保留Cassandra返回的原始列名,不会做任何字符转换。
参考代码:

from cassandra.cluster import Cluster
from cassandra.query import dict_factory
from cassandra.policies import DCAwareRoundRobinPolicy
from cassandra.auth import PlainTextAuthProvider

# 原有集群连接初始化逻辑
auth_provider = PlainTextAuthProvider(username='账号', password='密码')
cluster = Cluster(
    contact_points=['节点地址'],
    load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='本地机房名'),
    auth_provider=auth_provider
)
session = cluster.connect("my_keyspace")

# 设置行工厂为字典模式,保留原始列名
session.row_factory = dict_factory

# 执行查询,注意CQL语句中特殊列名仍需用双引号包裹
fetch_query = 'select time, "Mem Util %" from memutils;'
result = session.execute(fetch_query)
print(result[0])
# 输出: {'time': '631', 'Mem Util %': '9.177055477'}

注意:切换为字典行工厂后,无法再使用row.字段名的属性方式取值,需要通过row['原始列名']的键索引方式获取对应值,例如result[0]['Mem Util %']即可拿到目标列的数据。

内容的提问来源于stack exchange,提问作者sandejai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:48:22