from flask import Flask
from flask_mysqldb import MySQL
app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'todoapp'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
mysql = MySQL(app)
cur = mysql.connection.cursor()
if __name__ == '__main__':
app.run()
执行程序后显示错误:
cur = mysql.connection.cursor()
AttributeError: 'NoneType' object has no attribute 'cursor'.
根据 documentaction 它应该可以工作。我使用的是Ubuntu 16.04,我已经安装了MySQL并且运行正常。谁能解释为什么它不起作用?
这个错误是因为你在 Flask 应用还没完成初始化之前就试图连接数据库了。
mysql.connection
属性只有在 Flask 应用上下文环境中才有效,而在你代码的当前位置,应用上下文还没有被创建。
你需要将数据库连接的建立放在一个函数内部,并在请求处理函数中调用这个函数。这样,你就可以在 Flask 应用上下文环境中访问数据库连接了。
下面是修改后的代码:
from flask import Flask
from flask_mysqldb import MySQL
app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'todoapp'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
mysql = MySQL(app)
@app.route('/')
def index():
# 在请求处理函数内部获取数据库连接
cur = mysql.connection.cursor()
# 执行数据库操作
cur.execute("SELECT VERSION()")
data = cur.fetchone()
# 关闭数据库连接
cur.close()
return f"Database version: {data['VERSION()']}"
if __name__ == '__main__':
app.run()
在这个修改后的代码中:
-
我们将数据库连接的获取放到了
index()
函数内部,该函数是一个请求处理函数。 -
在
index()
函数内部,我们首先获取数据库连接,然后执行一个简单的查询,最后关闭数据库连接。 - 我们将查询结果返回给客户端。
现在,当你运行这段代码并访问
/
路径时,你应该能够看到数据库版本信息,而不会再遇到
AttributeError
错误。