Объект NoneType не имеет атрибута «курсор» - PullRequest
0 голосов
/ 12 октября 2018

Я создал очень простое веб-приложение, используя Flask, и у меня подключена база данных MySQL.К вашему сведению, я использую bash для windows.

Следующая функция регистрирует человека в базе данных Mysql, и она работает как положено.Объект курсора определен и данные сохранены в MySQL.

@app.route('/register', methods=['GET','POST'])
def register():
    form = RegisterForm(request.form)
    if request.method == 'POST' and form.validate():
        name = form.name.data
        email = form.email.data
        username = form.username.data
        password = hash.encrypt(str(form.password.data))

        # Create cursor
        cur = mysql.connection.cursor()
        cur.execute("INSERT INTO users(name, email, username, password) VALUES(%s, %s, %s, %s)",
        [name, email, username, password])

        # commit to db
        mysql.connection.commit()

        # close connection
        cur.close()

        flash('You are now registered and can log in', 'success')

        return redirect(url_for('login'))

    return render_template('register.html', form=form)

Проблема начинается, когда я хочу загрузить данные из mysql:

def data():
    cur = mysql.connection.cursor()
    cur.execute("SELECT * FROM users")
    mysql.connection.commit()
    cur.close()

data()

Я получаю ошибку:

Файл "app.py", строка 23, в данных cur = mysql.connection.cursor () AttributeError: Объект 'NoneType' не имеет атрибута 'cursor'

Как указано@Martijn Pieters, это означает, что я не смог подключиться к базе данных mysql.Вопрос в том, почему колба подключается без проблем в первой функции и имеет проблемы со второй функцией?

Ниже приведен мой импорт для репликации:

from flask import Flask, render_template, flash, request, redirect, url_for, session, logging, url_for
from data import Articles
from flask_mysqldb import MySQL
from wtforms import Form, StringField, TextAreaField, PasswordField, validators
from passlib.hash import sha256_crypt

app = Flask(__name__)

#init MYSQL
mysql=MySQL(app)

1 Ответ

0 голосов
/ 12 октября 2018

Ошибка возникает потому, что mysql.connection равно None.Здесь не имеет значения, какой тип объекта mysql.

Документация Flask-MySQL для MySQL.connection сообщает вам, когда этот атрибут будет None:

Пытается подключиться к серверу MySQL.

Возвращает: Связанный объект соединения MySQL в случае успеха или None в случае неудачи.

Таким образом, попытка подключения к серверу могла быть неудачной.Расширение откроет соединение с MySQL один раз за запрос;ему не удалось подключиться по отдельному запросу от того, который был успешным.

Глядя на исходный код для расширения Я вижу, что он также вернет None, когда нет приложенияконтекст (в этот момент _app_ctx_stack.top равен None. Вы не можете использовать эту функцию вне запроса.

Если вам нужно это за пределами запроса, вам нужно создать вручнуюконтекст приложения первый:

with app.app_context():
    cur = mysql.connection.cursor()
...