pyodbc连接SQL Server时cikis函数INSERT/UPDATE语句执行无效果
核心问题
两个低级语法错误导致事务没提交:
- 连接配置里的
autocommit=True写在了pyodbc.connect()括号外面,参数根本没传入,自动提交没生效 cikis函数里写的mycursor.commit、conn.commit都没加调用括号(),Python只会把这两行当成读取对象属性,根本不会执行提交方法。你对比正常运行的giris函数里写的是conn.commit(),带括号才是真正调用提交。
这俩问题叠在一起,导致你执行的INSERT、UPDATE语句都停留在未提交的事务里,既不会写入磁盘,还会锁住对应表的行,所以SSMS查表会一直显示执行状态,程序里读rowcount显示1只是语句在事务内执行成功的返回,不代表数据已经落库。
额外需要修正的问题
mycursor游标对象没有commit方法,pyodbc的事务提交只能通过连接对象conn.commit()调用- 连接字符串里的
\SQLEXPRESS是转义字符,要加r前缀标记为原始字符串,避免连接时找不到实例 - 遍历查询结果取车牌、车位号的逻辑有漏洞,要是查询返回多行只会保留最后一行数据,直接用
fetchone()取匹配的第一条结果更稳妥 - bool类型的
musaitlik、gecmis字段查询、传参时不用加引号,直接传整数0/1就行
修复后可直接运行的代码
import datetime import pyodbc # 修复:autocommit放入connect参数内,连接字符串加r前缀转义反斜杠 conn = pyodbc.connect( r'Driver={ODBC Driver 17 for SQL Server};' r'Server=DESKTOP-L68QR06\SQLEXPRESS;' r'Database=Otopark;' r'Trusted_Connection=yes;', autocommit=True ) def giris(plaka1): global plaka print("girdi") mycursor = conn.cursor() mycursor.execute("SELECT plaka from slot where plaka=?", (plaka1,)) kontrol = False for x in mycursor: if x[0] == plaka1: kontrol = True break if kontrol: print("Bu Araç Otoparktadır") else: mycursor = conn.cursor() girisTarih = datetime.datetime.now().strftime("%d.%m.%Y") girisSaat = datetime.datetime.now().strftime("%H:%M") musaitlik = 0 mycursor.execute("SELECT slotAd FROM slot WHERE musaitlik=1") slotAd = mycursor.fetchval() mycursor.execute( "UPDATE slot SET plaka=?,girisTarih=?,girisSaat=?,musaitlik=? WHERE slotAd=?", plaka1, girisTarih, girisSaat, musaitlik, slotAd ) conn.commit() print(mycursor.rowcount, "Giriş Yapildi.") plaka = "" def cikis(plaka1): global plaka print("cikti") mycursor = conn.cursor() mycursor.execute( "SELECT slotAd,plaka,girisTarih,girisSaat,musaitlik from slot where plaka=?", (plaka1,) ) slotAd = "" girisSaat = "" girisTarih = "" plaka2 = "" musaitlik = 1 gecmis = 0 aracTip = "a" ucret = 0 # 修复:直接取第一条匹配结果,避免多行数据覆盖 row = mycursor.fetchone() if row: plaka2 = row[1] girisTarih = row[2] girisSaat = row[3] slotAd = row[0] if plaka1 == plaka2: print(plaka1) print(plaka2, girisTarih, girisSaat, slotAd) cikisTarih = datetime.datetime.now().strftime("%d.%m.%Y") cikisSaat = datetime.datetime.now().strftime("%H:%M") sqlinsert = "INSERT INTO arsiv (plaka,aracTip,girisTarih,girisSaat,cikisTarih,cikisSaat,ucret,gecmis) VALUES (?,?,?,?,?,?,?,?)" mycursor.execute( sqlinsert, (plaka1, aracTip, girisTarih, girisSaat, cikisTarih, cikisSaat, ucret, gecmis) ) # 修复:调用连接对象的commit方法,加括号 conn.commit() print(mycursor.rowcount, "Arsive Eklendi.") mycursor.execute("UPDATE slot SET musaitlik=? WHERE slotAd=?", musaitlik, slotAd) conn.commit() print(mycursor.rowcount, "slotu bosaldi.") plaka = "" else: print("plaka bulunamadi.") tantuni = "52 AT 533" cikis(tantuni)
验证方法
改完重新运行后:
- 程序执行完不会残留未提交事务,SSMS查表不会再出现锁死、一直执行的状态
arsiv表能看到新增的52 AT 533的出场归档记录slot表A1对应的musaitlik字段会更新为1(空闲状态)
内容的提问来源于stack exchange,提问作者user19435919
相关产品推荐
相关产品推荐

