WAMP中MySQL查询正常但Python执行时计算字段为NULL的问题
嘿,我来帮你拆解这个问题——你遇到的情况其实是个很容易踩的小坑,咱们一步步说:
你的问题场景
你在Windows10上用Python 2.7.14写了一段查询MySQL的代码:
import MySQLdb mydb = MySQLdb.connect(host='localhost', user='root', passwd='', db='tifetal') cursor = mydb.cursor() sql = "select one_number,two_number, one_number * two_number as 'multiplied_number' from multiply_test" cursor.execute(sql) mydb.commit() cursor.close() print "Done"
执行后发现返回的multiplied_number全是NULL,但在WAMP的MySQL控制台跑一模一样的SELECT语句,结果却完全正常,乘积计算没问题。最后你用ikac给的UPDATE代码解决了问题:
import MySQLdb mydb = MySQLdb.connect(host='localhost', user='root', passwd='', db='tifetal') cursor = mydb.cursor() sql = "update multiply_test set multiplied_number = one_number * two_number" cursor.execute(sql) mydb.commit() cursor.close() print "Done"
问题出在哪?
核心原因超简单:你的Python代码根本没去读取查询结果!
你调用了cursor.execute(sql)执行SELECT,但后面没有任何获取结果集的操作(比如fetchall()或者fetchone()),所以你看到的“NULL结果”其实是个误解——你压根没拿到正确的查询数据,反而可能是之前的某个残留状态或者错误的输出。而MySQL控制台执行SELECT时会自动帮你把结果集返回展示,所以能看到正确的乘积。
另外多说一句:SELECT是读操作,完全不需要调用mydb.commit(),commit只针对INSERT/UPDATE/DELETE这类会修改数据的写操作,加在这里纯属多余。
如果你想直接获取动态计算的查询结果
把代码改成这样就行,重点是添加读取结果的步骤:
import MySQLdb mydb = MySQLdb.connect(host='localhost', user='root', passwd='', db='tifetal') cursor = mydb.cursor() sql = "select one_number,two_number, one_number * two_number as 'multiplied_number' from multiply_test" cursor.execute(sql) # 读取所有查询结果 all_results = cursor.fetchall() # 遍历打印结果 for row in all_results: print(f"one_number: {row[0]}, two_number: {row[1]}, multiplied_number: {row[2]}") # SELECT不需要commit,直接关闭资源 cursor.close() mydb.close() # 别忘了关数据库连接 print "Done"
为什么UPDATE的方法能“解决”?
因为UPDATE是写操作,它把乘积的计算结果直接写入到了表的multiplied_number字段里,相当于把动态计算的结果持久化存储了。之后不管你在控制台还是Python里查询,读到的都是已经计算好存在表里的值,自然就不是NULL了。
如果你的需求是每次查询都实时计算乘积,那用上面的SELECT读取结果的方式更合适;如果需要把计算结果固定存在表中,那UPDATE的方式就没问题。
内容的提问来源于stack exchange,提问作者Fiore

