解決したいこと
FlaskアプリでMySQLに接続し、データベースの操作(INSERTやSELECT)が正常に行えるようにしたいです。しかし、現在 'NoneType' object has no attribute 'cursor' というエラーが発生しており、正しく接続できていません。この問題を解決して、正常にデータベースにアクセスできるようにしたいです。
発生している問題・エラー
AttributeError: 'NoneType' object has no attribute 'cursor'
該当するソースコード
python
1from flask import Flask, render_template, request, redirect 2from flask_mysqldb import MySQL 3from config import Config 4 5app = Flask(__name__) 6app.config.from_object(Config) 7mysql = MySQL(app) 8 9@app.route('/', methods=['GET', 'POST']) 10def index(): 11 if mysql.connection is None: 12 return "Database connection failed" 13 14 if request.method == 'POST': 15 content = request.form['content'] 16 try: 17 cur = mysql.connection.cursor() 18 cur.execute("INSERT INTO posts (content) VALUES (%s)", (content,)) 19 mysql.connection.commit() 20 cur.close() 21 except Exception as e: 22 return f"An error occurred: {e}" 23 return redirect('/') 24 25 try: 26 cur = mysql.connection.cursor() 27 cur.execute("SELECT * FROM posts ORDER BY created_at DESC") 28 posts = cur.fetchall() 29 cur.close() 30 except Exception as e: 31 return f"An error occurred: {e}" 32 33 return render_template('index.html', posts=posts) 34 35@app.route('/test_db') 36def test_db(): 37 try: 38 cur = mysql.connection.cursor() 39 cur.execute("SELECT 1") 40 cur.close() 41 return "Database connection successful" 42 except Exception as e: 43 return f"Database connection failed: {e}" 44 45if __name__ == '__main__': 46 app.run(debug=True) 47このコードで、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/
どなたか、何が原因でこのエラーが発生しているのか、また解決方法についてアドバイスをいただけると助かります。よろしくお願いします。