游标对象的mysql python连接器属性错误

8wtpewkr  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(504)

我将mysql连接器python包用于flask中的一个项目。对于注册路由部分,我希望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)

函数的作用是:返回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。我不知道是什么导致了这个错误。然后我试着注解掉整个selectquery部分,只是测试了一下insert是否有效,果然有效。是什么导致了我的错误?

bvuwiixz

bvuwiixz1#

显然,对于mysql连接器,cursor.execute(…)将返回none,不管执行语句的结果是什么。但是,结果将存储在cursor对象本身中,即使结果是一个空集。在使用游标对新连接执行新语句之前,还必须获取当前查询的所有结果。这意味着:

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

相对于:

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

相关问题