Python技术迷

兄弟,这就是你写的收货地址接口?

你们想象一下,那种快下班状态,本来就想赶紧收拾回家,结果一刷代码,看到我们组那个小王写的收货地址接口,我是真没忍住,直接问了句:“兄弟,这就是你写的收货地址接口?”

Image

小王其实人挺老实的,他以为我逗他玩,就跟我说:“前端都传 default_flag = 1 了,逻辑都在接口里,你别担心。”但我当时脑袋都大了,你们是不是也遇到过这种,前端传个标志位就觉得能控制一切,真是服了。

我直接给他来了个灵魂拷问:“那你数据库现在有几个默认地址?”他愣住了,然后说应该只有一个吧。我说你别猜,你直接用 Postman 测一下呗,看看到底是几个。结果等他一查,发现一个用户下面有俩默认的,脸都红了。

其实你们遇到这种场景多不多?业务里默认地址这种玩意,根本不能只靠前端传个 flag。后端逻辑不做兜底,迟早出锅。这种东西要是线上炸了,客户打电话投诉,谁背锅?还不是我们这些写代码的。

后面他花了几个小时,把接口改了,又发我一版。我看了一下,功能倒是没啥大问题,就是写法嘛...反正你们懂得,大家能不能帮我看看还有没有什么坑。

我把核心逻辑抽一下,思路其实不复杂——新增收货地址时,如果 default_flag = 1,就要把之前所有这个用户的默认地址都给重置掉,只能有一个是默认的。这逻辑其实用 SQL 一句话就能搞定。

你们看下面这个写法,有啥改的空间没:

defadd_address(user_id, address_info, default_flag):
# 先插入前,判断一下是否要设置默认
if default_flag == 1:
# 把之前的都设为非默认
        sql = "UPDATE user_address SET default_flag=0 WHERE user_id=%s AND default_flag=1"
        cursor.execute(sql, (user_id,))
# 插入新地址
    sql = "INSERT INTO user_address (user_id, address_info, default_flag) VALUES (%s, %s, %s)"
    cursor.execute(sql, (user_id, address_info, default_flag))
    db.commit()

其实我觉得最大的问题,不在于“会不会 SQL”,而是有没有那个意识,后端要对数据完整性负责。你不能指望前端传啥你就信啥对吧?我以前见过更离谱的,default_flag 写死 0 或者 1,改地址的时候全靠前端自己切,数据全乱了,客户投诉直接哭了。

而且你们别觉得写到这里就万事大吉了,有时候还有并发问题。比如用户操作很快,两个请求一起过来,还是可能有问题,虽然概率小但不是没有。

有同学可能会问:“要不要加事务?”我觉得这个场景下,最好加一下,哪怕用最基础的数据库事务,别怕麻烦,哪天线上真出问题就来不及了。

你们再看一下这个加事务的写法,是不是更稳妥一点:

defadd_address(user_id, address_info, default_flag):
try:
        db.begin()  # 开启事务
if default_flag == 1:
            sql = "UPDATE user_address SET default_flag=0 WHERE user_id=%s AND default_flag=1"
            cursor.execute(sql, (user_id,))
        sql = "INSERT INTO user_address (user_id, address_info, default_flag) VALUES (%s, %s, %s)"
        cursor.execute(sql, (user_id, address_info, default_flag))
        db.commit()
except Exception as e:
        db.rollback()
        print("保存收货地址失败:", e)

昨天在公司楼下抽烟的时候,遇到做后端的老王,他说你们组这个接口早点就该改,早晚得出事。我说你咋知道,他说你看电商行业,收货地址只要设计不严谨,后面全靠人工擦屁股。

说到这里又跑题了,反正你们帮我挑挑刺呗。现在功能上已经没啥大问题了,就是不太放心小王的写法,他老是容易疏忽一些边角细节。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领