pyodbc执行多语句查询可返回结果,但数据库表未保存更改
问题分析与解决方案
你的问题核心是未提交事务。pyodbc默认关闭自动提交功能,所有INSERT/UPDATE操作都会处于未提交的事务中:当前连接能查询到临时结果,但其他会话(比如SSMS)无法看到这些更改;一旦连接关闭,未提交的事务会自动回滚,所有修改都会丢失。
解决方案
方案1:手动提交事务
在执行完SQL操作后,显式调用commit()提交事务,确保更改持久化到数据库。同时建议在异常时回滚事务,避免脏数据:
try: rows = self.cursor.execute(combined_code).fetchall() # 提交事务,保存所有更改 self.connection.commit() df = pd.DataFrame((tuple(t) for t in rows)) df.columns = [column[0] for column in self.cursor.description] if df.empty: print("APPSCHED_HEAD DF IS EMPTY!") else: upsert_redis("APPSCHED_HEAD",daystr,df) return df except Exception as e: # 出错时回滚事务,避免部分执行的修改残留 self.connection.rollback() print("Error occurred during insert:",e)
方案2:开启自动提交
在初始化连接时直接开启自动提交,这样每个SQL操作执行后都会自动提交事务:
class OJISQL(): def __init__(self): # 注意:原连接字符串末尾多余的`;')`已移除,避免连接失败 connectionString = "Driver={ODBC Driver 17 for SQL Server};Server=********,1433;Database=***;UID=****;PWD=****;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;" # 开启自动提交 self.connection = pyodbc.connect(connectionString, autocommit=True) self.cursor = self.connection.cursor()
额外提醒
你当前使用f-string直接拼接SQL的方式存在SQL注入风险,建议改用pyodbc的参数化查询(用?作为占位符),避免直接将外部数据拼接到SQL语句中。
内容的提问来源于stack exchange,提问作者Lukas Fürst
相关产品推荐
相关产品推荐

