一直膜拜python的各种库函数,以为他们都是完美无缺的。这周居然连续发现两处python2.4上MySQLdb模块的bug,看来《软件工程》讲的很有道理:所有软件都是有bug的,只有隐藏的深不深而已。 [1] executemany()函数接受两个参数sql和params,sql是要执行的sql语句,params是列表(list),包含了一个或者多个适用于sql语句的元组。查看源代码发现,它会判断sql语句是不是包含values子句(使用正则表达式search,居然没有忽略大小写?) 如果存在values子句,则拼凑成多个insert into ... values(..),(..),(..)的形式。但是它的拼凑逻辑没有考虑insert into ... values(..) on duplicate key update ...这种句式,导致params中含有超过一个元组时sql执行必出错。
[2] 当sql语句中包含case when子句作为结果返回,所有的case都返回int型时,返回值居然是str类型。或许MySQL需要统一返回值的类型,但是所有列都是int而得到的结果还是str,这多少有点说不过去。
所幸python2.7的MySQLdb已经修正了上述两个问题。最讨厌不稳定的东西,如果底层的东西都不可靠,又怎能写好稳定的软件呢?我对稳定性的追求已经超过了性能和扩展性本身。人总该有点偏执的,没有棱角的人早就被淘汰掉了。以后果断用高版本的python。
阅读(1139) | 评论(3) | 转发(0) |