Python操作MariaDB条码扫描逻辑中else语句被跳过问题排查
问题原因
你的新条码插入逻辑不触发的核心原因是:你把插入判断逻辑全部写在了for trackingNumber, status, shipTime, courier in cur:这个遍历查询结果的循环内部。当扫描到未入库的新条码时,执行的SELECT语句匹配不到任何记录,游标返回的结果集为空,这个for循环根本不会进入,循环内的if/else分支自然完全不会执行。
代码里还存在3个隐藏问题:
- 出库时间
dt_string在程序启动时就固定生成,后续所有扫码记录的出库时间都会显示为程序启动的时间,和实际扫码时间不符 - for循环中直接用查询返回的字段给
courier赋值,会覆盖你之前根据条码前缀识别出的快递公司结果 - 已有的重复判断
if trackingNumber in barcode逻辑冗余,WHERE条件已经做了trackingNumber的精确匹配,只要查询返回结果就代表条码已登记,不需要二次判断
修复后代码
import mariadb from datetime import datetime # 初始化数据库连接 conn = mariadb.connect( user="root", password="password", host="localhost", database="pythontest" ) cur = conn.cursor() while True: # 读取扫码结果,strip()清除扫码枪可能带入的首尾换行、空白字符 barcode = input("---> ").strip() # 每次扫码实时生成当前时间 now = datetime.now() dt_string = now.strftime("%d/%m/%Y %H:%M:%S") # 识别对应快递公司 if barcode.startswith("%"): courier = "DPD" elif barcode.startswith("JD"): courier = "Royal Mail" else: courier = "Unknown Courier" print("Unknown Courier") # 查询当前条码是否已出库 cur.execute( "SELECT trackingNumber, status, shipTime, courier FROM opencvdb WHERE trackingNumber=?", (barcode,) ) # trackingNumber为唯一标识,最多返回1条结果,直接用fetchone()获取即可 exist_record = cur.fetchone() if exist_record: # 查到记录=已出库,打印提示 _, _, shipTime, record_courier = exist_record print(f"Already Shipped at {shipTime} with {record_courier} - Tracking Number: {barcode}") else: # 无记录=新条码,执行插入 try: print("Shipping Now") cur.execute( "INSERT INTO opencvdb (trackingNumber, status, shipTime, courier) VALUES (?, ?, ?, ?)", (barcode, "Done", dt_string, courier) ) conn.commit() print(f"Last Inserted ID: {cur.lastrowid}") except mariadb.Error as e: print(f"Database Error: {e}") conn.rollback() # 出错时回滚事务,避免连接残留异常状态 conn.close()
后续优化建议
- 给数据库表
opencvdb的trackingNumber字段加唯一索引,从数据库层面彻底拦截重复条码的插入,避免代码逻辑异常时产生脏数据 - 后续接入OpenCV作为扫码源时,增加扫码结果去重缓存,避免同一帧画面重复识别同一个条码,触发多次重复判断
- 可以给数据库连接增加断线重连逻辑,避免程序长时间运行后连接断开导致功能异常
内容的提问来源于stack exchange,提问作者Ginger
相关产品推荐
相关产品推荐

