Python向SQL Server插入数据提示成功但数据库无更新求助
问题原因与解决方案
核心问题是事务未真正提交:你在代码中使用了cusor.commit(),但pyodbc中事务提交需要调用连接对象(conn)的commit方法,游标(cursor)本身并没有commit方法。虽然代码执行时没有抛出异常(可能是pyodbc的兼容处理),但实际上事务并未提交——同一个游标能查询到插入的数据是因为事务内的读一致性,但其他会话(比如MSSMS)无法看到未提交的事务数据。
另外代码中还有游标变量名拼写错误(cusor应为cursor),虽然不影响运行,但会增加维护隐患。
修正后的代码
import pyodbc import sys records = [ ['22DTHA13', 'CNTT khóa 22 lớp 4', 60], ['22DTHA14', 'CNTT khóa 22 lớp 5', 70], ] server = 'GIGABYTECUAT\\SQLEXPRESS' database = 'BAI02_QLSV1' username = '' password = '' # 优化连接字符串格式,去掉多余空格 connection_String = f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};UID={username};PASSWORD={password};TRUST_CONNECTION=yes;' try: conn = pyodbc.connect(connection_String) except Exception as e: print(e) print("任务终止") sys.exit() else: # 修正游标变量名拼写 cursor = conn.cursor() insert_statement = """ INSERT INTO LOP VALUES (?, ?, ?) """ try: for record in records: print(record) cursor.execute(insert_statement, record) # 查询事务内的数据(此时未提交,仅当前会话可见) cursor.execute("SELECT * FROM LOP WHERE SISO >=50") rows = cursor.fetchall() for row in rows: print(row) # 使用连接对象提交事务 conn.commit() print("记录插入成功") except Exception as e: # 异常时回滚事务 conn.rollback() print(f'错误: {e}') print("事务已回滚") finally: # 关闭游标和连接 if cursor: cursor.close() if conn: print('连接已关闭') conn.close()
关键修改点
- 将游标变量名
cusor改为正确的cursor - 把
cursor.commit()替换为conn.commit(),确保事务真正提交 - 移除重复的commit调用,简化逻辑
- 添加异常时的事务回滚,避免未提交事务占用资源
- 优化连接字符串的格式,去除多余空格
执行修正后的代码后,事务会正确提交,你在MSSMS中就能看到LOP表的新增数据了。
内容的提问来源于stack exchange,提问作者Vănn Thịnh
相关产品推荐
相关产品推荐

