MySQL游标执行查询报错:AttributeError: 'NoneType'对象无execute属性
解决AttributeError: 'NoneType' object has no attribute 'execute'问题
我一眼就看出问题出在哪了——你创建第二个游标时用错了方法!
核心错误原因
你已经成功建立了conn1这个连接对象,但你调用了conn1.connect()来创建游标,这完全不对。connect()是mysql.connector模块用来新建连接的函数,而不是已连接对象的方法。调用conn1.connect()会返回None,所以你的cursor1其实是个空对象,自然调用不了execute()方法。
两步修正方案
正确创建游标
对于已经存在的连接对象,创建游标应该用.cursor()方法,和你第一个游标cursor = conn.cursor()的写法一致。修复SQL语句的变量传递问题
你写的uid='row[0]'会把row[0]当成字符串字面量传给数据库,而不是取row列表里第一个元素的值。而且这种写法还存在SQL注入风险,正确的做法是用参数化查询。
修正后的完整代码片段
from fpdf import FPDF, HTMLMixin import mysql.connector class HTML2PDF(FPDF, HTMLMixin): pass # 其实不需要创建3个独立连接,一个连接可以创建多个游标,这里先保留你的写法 conn = mysql.connector.connect(host='localhost', database='swd', user='root', password='param2000') conn1 = mysql.connector.connect(host='localhost', database='swd', user='root', password='param2000') conn2 = mysql.connector.connect(host='localhost', database='swd', user='root', password='param2000') # 第一个游标正常工作 cursor = conn.cursor() cursor.execute("SELECT * from 14batch") row = cursor.fetchone() html='''blah blah blah''' # 修正1:用cursor()创建游标,而不是connect() cursor1 = conn1.cursor() # 修正2:用参数化查询传递变量,避免SQL注入和变量引用错误 cursor1.execute("SELECT * from med_ins_14batch where uid=%s", (row[0],)) row1 = cursor1.fetchone()
额外优化建议
其实你根本不需要创建3个独立的数据库连接,同一个连接对象可以创建多个游标,这样能减少资源消耗,比如:
# 只创建一个连接 conn = mysql.connector.connect(host='localhost', database='swd', user='root', password='param2000') # 基于同一个连接创建多个游标 cursor = conn.cursor() cursor1 = conn.cursor() cursor2 = conn.cursor()
内容的提问来源于stack exchange,提问作者Param Bhatt
相关产品推荐
相关产品推荐

