解决pymysql使用%s占位符传参报TypeError: not enough arguments for format string的问题

本文探讨了在SQL查询中遇到的TypeError问题,具体是关于字符串格式化的问题。作者发现将参数改为%(,,)的形式可以避免错误,但未理解其原因。文章邀请大神解析这个问题,并提供了修正后的SQL查询语句示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这样写就会报typeError错误

sql = "SELECT * FROM pas_app_inout_plan WHERE departure_train_code = '%s' AND station_name = '%s' and DATE_FORMAT(arrival_time,'%%Y-%%m-%%d') like '%s' ORDER BY arrival_time DESC"%input7.get()%input6.get()%input9.get()

给参数改成%(,,)的形式就不会报错了,这个原因还没搞明白,希望有大神给解惑下啊

sql = "SELECT * FROM pas_app_inout_plan WHERE departure_train_code = '%s' AND station_name = '%s' and DATE_FORMAT(arrival_time,'%%Y-%%m-%%d') like '%s' ORDER BY arrival_time DESC"%(input7.get(),input6.get(),input9.get())
### 回答问题 #### 错误描述 在执行代码时,遇到了错误:`not all arguments converted during string formatting`。这表明在字符串格式化过程中,提供的参数数量与占位符数量不匹配。 --- #### 问题原因分析 1. **字符串格式化的基本规则**: - 在Python中,使用`%`进行字符串格式化时,需要确保占位符的数量与提供的参数数量一致。 - 如果占位符数量多于参数数量,就会抛出此错误。 2. **可能的错误来源**: - SQL语句中的占位符(如`%s`)数量与实际传递的参数数量不匹配。 - 例如,SQL语句中有两个`%s`占位符,但只传递了一个参数。 --- #### 解决方法 确保SQL语句中的占位符数量与实际传递的参数数量一致。以下是修正后的代码: ```python import pymysql def query_sql(): """ 查询数据库中的数据并更新。 """ connection = pymysql.connect( host='localhost', # 数据库地址 user='root', # 用户名 password='password', # 密码 database='fusion', # 数据库名称 charset='utf8mb4' # 字符集 ) try: with connection.cursor() as cursor: # 查询需要翻译的数据 sql_select = "SELECT vod_id, vod_name FROM mac_vod WHERE vod_id < %s" cursor.execute(sql_select, (20,)) # 确保传递的参数是一个元组 results = cursor.fetchall() update_data = [] for row in results: vod_id = row[0] vod_name = row[1] # 假设这里有一个翻译函数 translate translated_text = translate(vod_name) if translated_text: update_data.append((translated_text, vod_id)) # 批量更新翻译后的内容到数据库 if update_data: sql_update = "UPDATE mac_vod SET vod_sub = %s WHERE vod_id = %s" cursor.executemany(sql_update, update_data) connection.commit() except Exception as e: connection.rollback() print(f"发生错误: {e}") finally: connection.close() def translate(text): """ 示例翻译函数。 :param text: 要翻译的文本 :return: 翻译后的文本 """ return f"Translated_{text}" # 示例返回值 if __name__ == '__main__': query_sql() print("查询并更新完成!") ``` --- ### 解释 1. **字符串格式化问题**: - 在SQL语句中,`%s`是占位符,用于防止SQL注入攻击。 - 必须确保传递给`execute`或`executemany`的参数数量与SQL语句中的占位符数量一致。 - 如果只有一个参数,也需要将其包装为元组,例如`(20,)`。 2. **批量更新**: - 使用`executemany`方法可以一次性执行多条更新语句,提高性能。 - `update_data`列表中的每个元素都是一个元组,包含两个值:翻译后的文本和对应的`vod_id`。 3. **异常处理**: - 使用`try-except-finally`块确保事务的安全性。 - 如果发生错误,程序会回滚事务以避免数据不一致。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值