Flaskアプリで 'NoneType' object has no attribute 'cursor' エラーが発生します(PythonAnywhere使用)
Q&A
Closed
解決したいこと
FlaskアプリでMySQLに接続し、データベースの操作(INSERTやSELECT)が正常に行えるようにしたいです。しかし、現在 'NoneType' object has no attribute 'cursor' というエラーが発生しており、正しく接続できていません。この問題を解決して、正常にデータベースにアクセスできるようにしたいです。
発生している問題・エラー
AttributeError: 'NoneType' object has no attribute 'cursor'
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
from flask import Flask, render_template, request, redirect
from flask_mysqldb import MySQL
from config import Config
app = Flask(__name__)
app.config.from_object(Config)
mysql = MySQL(app)
@app.route('/', methods=['GET', 'POST'])
def index():
if mysql.connection is None:
return "Database connection failed"
if request.method == 'POST':
content = request.form['content']
try:
cur = mysql.connection.cursor()
cur.execute("INSERT INTO posts (content) VALUES (%s)", (content,))
mysql.connection.commit()
cur.close()
except Exception as e:
return f"An error occurred: {e}"
return redirect('/')
try:
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM posts ORDER BY created_at DESC")
posts = cur.fetchall()
cur.close()
except Exception as e:
return f"An error occurred: {e}"
return render_template('index.html', posts=posts)
@app.route('/test_db')
def test_db():
try:
cur = mysql.connection.cursor()
cur.execute("SELECT 1")
cur.close()
return "Database connection successful"
except Exception as e:
return f"Database connection failed: {e}"
if __name__ == '__main__':
app.run(debug=True)
このコードで、MySQLデータベースに接続し、データの取得や挿入を行おうとしていますが、データベース接続が NoneType となり、カーソルオブジェクトの操作に失敗しています。
自分で試したこと
試したこと:
config.py の設定は以下の通りです:
MYSQL_HOST: slothvillage.mysql.pythonanywhere-services.com
MYSQL_USER: slothvillage
MYSQL_PASSWORD: 正しいパスワードを使用しています
MYSQL_DB: slothvillage$default
MYSQL_CURSORCLASS: 'DictCursor'
/test_db というルートを追加してデータベース接続をテストしましたが、「Database connection failed」というメッセージが表示されます。
その他:
MySQLに手動で接続する際は、正しいパスワードを入力して接続できています。
app.py と config.py は同じディレクトリに配置されており、ディレクトリ構造には問題ないと思われます。
ディレクトリの構造は以下の通りです:
my_flask_app/
app.py
config.py
templates/
static/
どなたか、何が原因でこのエラーが発生しているのか、また解決方法についてアドバイスをいただけると助かります。よろしくお願いします。