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
相关产品推荐
相关产品推荐

