带班那几年,最怕的不是图纸复杂,是材料送到楼下发现送错楼了。楼号差不多,一个12栋,一个21栋,司机没细看,卸完就走了。等上面要验收,数对不上,监理来找我,我还跟人家犟,说料单上签了字的。后来上去一看,货堆在隔壁楼的基础里,不怪司机,怪我没把楼号标清楚。
星期二晚上我也撞上这么一档子事。不对,是今天凌晨。
我上个月开始学着用 sqlite 写报销记账的小工具,不整大的,就是记工地上的零星开销,买盒烟、请人吃饭、垫了个运费什么的。头一天还好好的,能跑出来38条记录。第二天晚上打开终端再跑一遍,报错了:
sqlite3.OperationalError: no such table: zhichu
我当时就愣了,这表是我亲手建的,建表的代码就在文件里,CREATE TABLE IF NOT EXISTS,这个就算重复跑也不会出错啊。第一反应是文件被我改坏了,赶紧打开编辑器看。看了三遍没看出毛病。又以为是电脑的问题,重启了一趟终端,再跑,还是这个错。
十一点多,孩子都睡了我坐回桌前,盯着这行字,盯了二十分钟没想明白。我用 ChatGpt 问了一嘴,它说是路径问题。我不服。我用的就是相对路径啊,不可能两个地方跑。
嗯,它说的其实就是这个意思。相对路径,不是绝对的,你在哪个目录下启动程序,它就在哪找文件。我头一天在 D 盘那个专门放代码的文件夹里跑的,数据库文件生成在那儿了。今天打开终端,默认在 C 盘用户目录下,也没cd,直接 python run.py,它就在 C 盘用户目录底下又新建了一个空的数据库,里面没有 zhichu 这张表,所以报错。
这个比方可能不太恰当,但真就跟钢筋下料单一个道理。你写下"12栋三层柱18根",材料跟到现场,工人得知道抬到12栋去,而不是扔在最近的空地上。数据库文件也是一样,你代码里写个相对路径,它不会去找你心里想的那个位置,它就在它出生的地方干活。
我拿 dir 一搜,C 盘用户目录下果然躺着一个 changzhi.db,才4KB。D 盘那个是37KB。数据全在大的那个里面。合上电脑都快一点了,说不清楚是气自己还是气这台电脑。后来把路径改成了绝对路径,跑通了,38条记录齐刷刷躺在那儿。
这个事儿让我想起工地上的老规矩:不光是料要对,你告诉工人料在哪儿的那句话,也得对。代码里也一样,光知道有这条路不行,你还得指给程序看。
四十岁学编程,学的全是这种东西,看着不像知识,倒像教训。但教训也是收货。