Python的问题:AttributeError:';非类型';对象没有属性';执行';
我开始学习Python,但我遇到了一些问题,我不知道确切的原因。我有这两个文件,据我所知,问题是两个文件之间的连接,我想。 我已经浏览了一些其他与之相关的问题,但似乎没有一个能解决我的问题 文件1,MysqlDB.pyPython的问题:AttributeError:';非类型';对象没有属性';执行';,python,Python,我开始学习Python,但我遇到了一些问题,我不知道确切的原因。我有这两个文件,据我所知,问题是两个文件之间的连接,我想。 我已经浏览了一些其他与之相关的问题,但似乎没有一个能解决我的问题 文件1,MysqlDB.py # -*- coding: utf-8 -*- import MySQLdb class DB: def __init__(self, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME, DB_CHARSET):
# -*- coding: utf-8 -*-
import MySQLdb
class DB:
def __init__(self, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME, DB_CHARSET):
self.host = DB_HOST
self.port = DB_PORT
self.name = DB_NAME
self.user = DB_USER
self.password = DB_PASSWORD
self.charset = DB_CHARSET
def get_conn(self):
try:
if self.conn is None:
self.conn = MySQLdb.connect(host = self.host,
port = self.port,
db = self.name,
user = self.user,
passwd = self.password,
charset = self.charset)
return self.conn
except:
print("Can't connect to database")
def get_cursor(self):
try:
self.cursor = self.conn.cursor()
return self.cursor
except:
print("Can't define cursor (cursor == None)")
def close_conn(self):
if self.conn:
self.conn.close()
File2,users.py
# -*- coding: utf-8 -*-
import MysqlDB
from usersVO import UsersVO
class UsersDAO():
def loginUser(self, tmpEmail, tmpPassword):
OBJdb = MysqlDB.DB('127.0.0.1',3306,'root','','musica','utf8')
OBJconn = OBJdb.get_conn()
OBJcursor = OBJdb.get_cursor()
queryLogin = "SELECT * FROM users WHERE email_USER LIKE '{}' and password_USER LIKE '{}'".format(tmpEmail, tmpPassword)
OBJcursor.execute(queryLogin)
Class = UsersDAO()
Class.loginUser('test@email.com','test')
当我尝试在users.py上测试登录操作时,我总是得到以下结果:
"AttributeError: 'NoneType' object has no attribute 'execute'"
为什么OBJcursor得到None值?我该如何解决这个问题呢?作为一个补充说明,除了案例(
MysqlDB
vs.MysqlDB
)之外,拥有一个与您正在使用的另一个模块同名的模块是一个非常糟糕的主意,它在Windows上会崩溃,在Mac上可能会崩溃,也可能不会崩溃(很难预测),您的get\u cursor
函数有一个空的,除了:
它只打印“不能定义游标(cursor==None)”
并返回None
。这意味着你不知道什么失败了,只知道什么东西失败了。如果你想调试它,要么删除它,这样你就可以得到一个异常,要么把它改成异常为e:
,然后打印一些有用的东西,比如“不能定义游标(游标==None):{!r)”。格式化(e)
。你在获取连接()中也有一个严重的问题
:第一次调用它时,它可能会工作,但之后每次调用它时,它都会返回None
,因为返回self.conn
仅发生在内部,如果self.conn为None:
。此外,您也在执行相同的操作“隐藏错误以使其无法调试”除了:get\u conn()
中的东西,所以很可能是get\u conn()
失败,返回了None
,没有设置self.conn
,这就是为什么get\u cursor
也失败的原因。但是我们无法知道是否发生了这种情况。另一个注意事项是:不要使用str.format
来填充SQL查询,使用数据库的查询参数。换句话说,queryLogin=“选择…如%s和密码\u用户如%s”
,然后选择对象。执行(queryLogin,(tmpEmail,tmpPassword)
。有关如何执行以及为什么执行的详细信息,请参阅。