【问题标题】:'NoneType' object has no attribute 'cursor'“NoneType”对象没有属性“光标”
【发布时间】:2019-03-17 17:04:40
【问题描述】:

我使用 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 行,数据中 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)

【问题讨论】:

    标签: mysql flask mysql-python


    【解决方案1】:

    当您的数据库连接未建立时会发生这些错误。所以请检查您的数据库连接方法和属性,然后尝试执行。

    【讨论】:

      【解决方案2】:

      发生错误是因为mysql.connectionNone。这里不管mysql是什么类型的对象。

      Flask-MySQL documentation for MySQL.connection 告诉您该属性何时变为None

      尝试连接到 MySQL 服务器。

      返回:如果成功则绑定 MySQL 连接对象,如果不成功则None

      所以连接到服务器的尝试可能会失败。该扩展将在每个请求中打开一次与 MySQL 的连接;它无法连接成功的请求的单独请求。

      查看source code for the extension,我发现当没有应用上下文时它也会返回None(此时_app_ctx_stack.topNone)。您不能在请求之外使用此功能。

      如果你在请求之外确实需要这个,你需要先manually create an app context

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

      【讨论】:

      • @Toutsos:我注意到为每个请求创建一个新连接几乎没有效率。您可能希望查看 Flask-SQLAlchemy 以获得更强大的解决方案(这将利用连接池来重用现有连接,这些连接保持打开更长时间)。并不是说这会解决您的“无应用上下文”问题。
      • 我花了好几个小时才找到这个,我一辈子都想不通为什么它不起作用。如果在没有任何警告的情况下没有应用上下文,则返回 None 是很糟糕的
      • 检查 stackoverflow.com/a/49436371/9106179 它对我有用。
      • @DrPotato:这与此扩展无关,该答案适用于 SQLAlchemy,不是 Flask-MySQL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2021-11-02
      • 2014-07-05
      • 2018-05-05
      • 2013-02-11
      相关资源
      最近更新 更多