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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:42:58