游标对象的MySQL-Python连接器属性错误

时间:2018-09-19 07:57:51

标签: python mysql mysql-connector mysql-connector-python

我在Flask中为项目使用mysql-connector-python包。对于注册路由部分,我希望MySQL检查用户名是否已经存在,如果存在,我将设置一个错误。我的代码如下:

@bp.route('/signup', methods=('POST',))
def signup():

    ...

    username = reqObj["username"]
    password = reqObj["password"]
    error = None

    db = get_db()
    cursor = db.cursor()
    query = ("SELECT * FROM userinfo " 
        "WHERE username=%s")

    existingUser = cursor.execute(query, (username,)).fetchone()

    if existingUser is not None:
        error = "Username already exists"

    if error is None:
        cursor.execute(
            'INSERT INTO userinfo (username, password) VALUES (%s, %s)',
            (username, generate_password_hash(password))
        )

        cursor.close()
        db.commit()

        res = {'actionSuccess': True}
        return jsonify(res)
    else:
        res = {'actionSuccess': False, 'error': error}
        return jsonify(res)

get_db()函数返回mysql.connector.connect()对象。但是,当我在服务器上运行它并对其进行测试时,我在Flask中收到一条错误消息:

...
existingUser = cursor.execute(query, (username,)).fetchone()
AttributeError: 'NoneType' object has no attribute 'fetchone'

所以我发现我的错误出在我的cursor.execute()某处,我猜这是在返回NoneType。所以我删除了fetchone()函数,然后重试,但是现在我得到了这个错误:

...
File "e:\flasktest2\lib\site-packages\mysql\connector\connection.py", line 1128, in handle_unread_result
    raise errors.InternalError("Unread result found")
mysql.connector.errors.InternalError: Unread result found

这更加令人困惑,因为它现在说的是存在未读结果,而前一刻cursor.execute()是一个NoneType。我不知道是什么原因引起的错误。然后,我尝试注释掉整个SELECT查询部分,并进行了测试以查看INSERT是否可以工作,并且确定它可以工作。是什么导致我的错误?

1 个答案:

答案 0 :(得分:0)

因此,显然,使用mysql连接器,无论执行语句的结果如何,cursor.execute(...)都将返回None。但是,即使结果为空集,结果也将存储在光标对象本身中。您还必须在使用游标在新连接上执行新语句之前,获取当前查询的所有结果。这就是说:

cursor.execute(...)
cursor.fetchone()

相对于:

cursor.execute(...).fetchone()