向RDS表插入数据时出现字符串格式化错误求助
解决RDS Folders表插入数据的格式化与语法错误
核心问题根源
你遇到的两个错误,本质都是手动拼接SQL字符串导致的:混用%%s和%s会引发参数数量不匹配,手动加单引号又会因为特殊数据类型(比如数组parents)触发语法解析错误,同时这种写法还存在SQL注入风险。
正确解决方案:使用参数化查询
不管你用的是PostgreSQL(psycopg2)还是MySQL(mysql-connector),都应该用数据库驱动原生的参数化查询方式,而非手动格式化SQL。
示例代码(Python + psycopg2 适配PostgreSQL)
import psycopg2 def salvarDB(item, db_conn): # 用%s作为参数占位符(psycopg2规范,不是字符串格式化的%s) insert_sql = """ INSERT INTO Folders (id, name, createdTime, parents) VALUES (%s, %s, %s, %s) """ # 提取参数,数组类型直接传列表即可 params = (item['id'], item['name'], item['createdTime'], item['parents']) cursor = db_conn.cursor() try: cursor.execute(insert_sql, params) db_conn.commit() except Exception as e: db_conn.rollback() raise e finally: cursor.close() # 遍历插入示例 target_items = [ {'parents': ['1bX__7p5rkhjFEmNtkfvQFPdbat'], 'id': '1lAixT6Z0qvyHxYa7DkCfSUxUiI', 'name': '220923_P_C', 'createdTime': '2022-09-23T15:03:59.308Z'} ] # 替换为你的RDS连接信息 conn = psycopg2.connect("dbname=your_db user=your_user password=your_pass host=your_rds_host") for item in target_items: salvarDB(item, conn) conn.close()
示例代码(Python + mysql-connector 适配MySQL)
如果你的RDS是MySQL,注意parents字段若为JSON类型,直接传列表会自动转换:
import mysql.connector def salvarDB(item, db_conn): insert_sql = """ INSERT INTO Folders (id, name, createdTime, parents) VALUES (%s, %s, %s, %s) """ params = (item['id'], item['name'], item['createdTime'], item['parents']) cursor = db_conn.cursor() try: cursor.execute(insert_sql, params) db_conn.commit() except Exception as e: db_conn.rollback() raise e finally: cursor.close()
错误原因拆解
- not all arguments converted during string formatting:
混用%%s(转义后变成普通字符s)和%s时,SQL语句中实际需要的参数数量和你传入的参数数量不匹配,导致字符串格式化失败。 - syntax error at near "0":
手动给%s加单引号后,数组parents会被格式化为'['1bX__...']',数据库会把[当成非法语法,触发解析错误。参数化查询会自动处理不同数据类型的格式转换,避免这类问题。
额外注意事项
- 确保Folders表的
parents字段类型和传入数据匹配:PostgreSQL用ARRAY类型,MySQL用JSON或TEXT类型(若存储字符串数组)。 - 永远不要手动拼接SQL参数,参数化查询是最安全且能彻底避免格式错误的方案。
内容的提问来源于stack exchange,提问作者Aloysio
相关产品推荐
相关产品推荐

