使用Python执行多条SQL语句遇阻:仅Truncate语句生效求解
解决pyodbc执行多条SQL仅第一条生效的问题
核心原因
- pyodbc默认单次
execute()只能执行单条SQL语句,多语句会被截断,仅执行第一条。 - DB2中
TRUNCATE TABLE属于DDL语句,执行后会自动提交事务;而INSERT是DML语句,需要手动提交事务才能持久化,若未提交,断开连接后会自动回滚。
解决方案
方案1:拆分语句分别执行(推荐)
将两条SQL分开执行,同时确保手动提交事务,逻辑清晰且易调试:
import pyodbc # 数据库连接配置 conn = pyodbc.connect( "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=your_db;HOSTNAME=your_host;PORT=your_port;PROTOCOL=TCPIP;UID=your_user;PWD=your_pwd;" ) cursor = conn.cursor() table_name = 'Table1' # 执行TRUNCATE truncate_sql = f"TRUNCATE TABLE {table_name} IMMEDIATE;" cursor.execute(truncate_sql) # 执行INSERT(带参数) insert_sql = f"INSERT INTO {table_name} (Year, UserNr, Username, Age) VALUES (?, ?, ?, ?)" # 替换为你的实际参数 params = (2024, 1001, "JohnDoe", 30) cursor.execute(insert_sql, params) # 提交事务(关键!DML语句需要提交) conn.commit() # 关闭连接 cursor.close() conn.close()
方案2:开启多语句执行支持
如果一定要在单次调用中执行多条语句,需要在连接字符串中添加MULTI_STATEMENTS=TRUE参数,同时注意事务提交:
import pyodbc # 连接字符串添加多语句支持 conn = pyodbc.connect( "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=your_db;HOSTNAME=your_host;PORT=your_port;PROTOCOL=TCPIP;UID=your_user;PWD=your_pwd;MULTI_STATEMENTS=TRUE;" ) cursor = conn.cursor() table_name = 'Table1' sql = f""" TRUNCATE TABLE {table_name} IMMEDIATE; INSERT INTO {table_name} (Year, UserNr, Username, Age) VALUES (?, ?, ?, ?) """ params = (2024, 1001, "JohnDoe", 30) cursor.execute(sql, params) # 提交事务 conn.commit() cursor.close() conn.close()
注意事项
- 不要直接拼接外部输入到SQL语句中,避免SQL注入风险(若
table_name来自外部输入,需做严格校验)。 - 若使用pandas写入数据,可先用
pandas.DataFrame.to_sql()执行插入,但要确保先执行TRUNCATE并提交事务。
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

