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

问题描述 投票:0回答:4

我使用 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 数据库。问题是,为什么 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)
mysql flask mysql-python
4个回答
22
投票

发生错误是因为

mysql.connection
None
mysql
是什么类型的对象并不重要。

MySQL.connection

Flask-MySQL 文档会告诉您该属性何时会是 
None
:

尝试连接到 MySQL 服务器。

返回:成功则绑定MySQL连接对象,失败则

None

因此尝试连接到服务器可能会失败。该扩展将在每次请求时打开一次与 MySQL 的连接;它无法根据与成功的请求不同的单独请求进行连接。

查看扩展的源代码,我发现当没有应用程序上下文时它也会返回

None
(此时
_app_ctx_stack.top
None
)。您不能在请求之外使用此功能。

如果您确实在请求之外需要此功能,则需要先手动创建应用程序上下文

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

0
投票

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


0
投票

如果您在 conda 中创建环境可能会出现错误 相反

  1. pip 安装虚拟环境
  2. 虚拟环境测试45
  3. .nv\Scripts activate{在 Windows 中}
  4. pip 安装烧瓶
  5. pip 安装flask_mysqldb

会起作用的


-1
投票

这些错误可能是由于您的连接文件而发生的。 例如:

import sqlite3

def db_connection():
    conn = None
    try:
        conn = sqlite3.connect("path_of_db/db_name.sqlite")
    except sqlite3.Error as e:
        print(e)
    return conn

如果路径丢失或由于路径错误,您将面临类似的错误。

© www.soinside.com 2019 - 2024. All rights reserved.