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

向Cassandra插入数据报错TypeError:参数未全部转换的问题求解

Cassandra Python驱动INSERT报错TypeError的原因及修复

错误原因

Cassandra官方Python驱动(cassandra-driver)默认使用**%s作为参数占位符**,而非你代码里用的?。当你用?作为占位符时,驱动会将整个SQL语句视为普通字符串,不会识别?为参数绑定位,导致传入的4个参数无法被正确解析,从而抛出TypeError: not all arguments converted during string formatting错误。

修复方法

有两种可行的修复方式:

方法1:替换占位符为%s

直接把INSERT语句里的?换成%s,这是驱动原生支持的占位符格式:

# 修改后的INSERT查询
insert_query = "INSERT INTO songs_by_sessionid (sessionid, artist, song, length) VALUES (%s, %s, %s, %s)"

# 执行插入,参数不变
session.execute(insert_query, (session_id, artist_name, song_name, song_length))

方法2:使用预编译语句(PreparedStatement)

如果习惯用?作为占位符,可以通过预编译语句实现,预编译语句会自动处理占位符解析:

# 预编译INSERT语句
prepared_insert = session.prepare("INSERT INTO songs_by_sessionid (sessionid, artist, song, length) VALUES (?, ?, ?, ?)")

# 执行预编译语句
session.execute(prepared_insert, (session_id, artist_name, song_name, song_length))

完整修复后的代码示例

from cassandra.cluster import Cluster

cluster = Cluster(['localhost'])
session = cluster.connect('my_keyspace_test')

create_query = """CREATE TABLE IF NOT EXISTS my_keyspace_test.songs_by_sessionID (
        sessionID INT,
        artist TEXT,
        song TEXT,
        length FLOAT,
        PRIMARY KEY (sessionID)
    );"""

session.execute(create_query)

session_id = 251
artist_name = "Your Artist"
song_name = "Your Song"
song_length = 125.2

# 方法1:使用%s占位符
insert_query = "INSERT INTO songs_by_sessionid (sessionid, artist, song, length) VALUES (%s, %s, %s, %s)"
session.execute(insert_query, (session_id, artist_name, song_name, song_length))

# 或者方法2:使用预编译语句
# prepared_insert = session.prepare("INSERT INTO songs_by_sessionid (sessionid, artist, song, length) VALUES (?, ?, ?, ?)")
# session.execute(prepared_insert, (session_id, artist_name, song_name, song_length))

cluster.shutdown()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:27:37