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

