Ошибка атрибута коннектора MySQL-Python для объекта курсора - PullRequest
0 голосов
/ 19 сентября 2018

Я использую пакет mysql-connector-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)

Функция 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 голосов
/ 19 сентября 2018

Таким образом, очевидно, что с помощью соединителя mysql cursor.execute (...) вернет None, независимо от того, каковы результаты выполнения операторов.Однако результаты будут сохранены в самом объекте курсора, даже если результат является пустым набором.Вы также должны получить все результаты для текущего запроса, прежде чем использовать курсор для выполнения новых операторов и для нового соединения.Это значит:

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

вместо:

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