You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:25:53