'nonetype'对象没有属性'cursor'

w8ntj3qf  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(435)

我用flask创建了一个非常简单的web应用程序,并且连接了一个mysql数据库。仅供参考,我在windows上使用bash。
下面的函数将一个人注册到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行,在data cur=mysql.connection.cursor()attributeerror中:“nonetype”对象没有属性“cursor”
正如@martijnpieters所指出的,这意味着我无法连接到mysql数据库。问题是,为什么flask连接在第一个函数中没有问题,而在第二个函数中有问题?
以下是我的复制导入:

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)
bbmckpt7

bbmckpt71#

发生错误的原因是 mysql.connectionNone . 在这里什么类型的物体并不重要 mysql 是。
mysql文档 MySQL.connection 告诉你什么时候该属性 None :
尝试连接到mysql服务器。
返回:如果成功或 None 如果不成功。
因此尝试连接到服务器可能失败。扩展将为每个请求打开一个到mysql的连接;它无法在成功的请求之外的另一个请求上连接。
查看扩展的源代码,我发现它也会返回 None 当没有应用程序上下文时(此时) _app_ctx_stack.topNone . 不能在请求之外使用此函数。
如果在请求之外确实需要此功能,则需要首先手动创建应用程序上下文:

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

相关问题