質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

359閲覧

Flaskアプリで 'NoneType' object has no attribute 'cursor' エラーが発生します(PythonAnywhere使用)

bqbq

総合スコア0

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/08/12 06:15

解決したいこと

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/
どなたか、何が原因でこのエラーが発生しているのか、また解決方法についてアドバイスをいただけると助かります。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2024/08/12 07:17

> AttributeError: 'NoneType' object has no attribute 'cursor' 上記エラーはどのコードで発生しているのでしょうか?
bqbq

2024/08/12 07:41

質問ありがとうございます。助かります。 `AttributeError: 'NoneType' object has no attribute 'cursor'` というエラーは、次のコード行で発生しています。 ```python cur = mysql.connection.cursor() ``` 具体的には、`index()` 関数内でデータベース接続を確立しようとした際、`mysql.connection` が `None` になっているため、このエラーが発生しています。 エラーが発生する箇所は以下の部分です: ```python @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) ``` このエラーが発生している理由は、`mysql.connection` が `None` になっているためであり、その結果として `cursor()` メソッドが呼び出せない状態です。
meg_

2024/08/12 07:55

test_db()ではエラーは発生しないということですか?
meg_

2024/08/12 08:00 編集

> 具体的には、`index()` 関数内でデータベース接続を確立しようとした際、`mysql.connection` が `None` になっているため、このエラーが発生しています。 下記コードは有効になっていないということですか? > if mysql.connection is None: return "Database connection failed" Python、Flask、Flask-MySQLdbのバージョン情報も質問に追記されると良いかと思います。
guest

回答1

0

config.py の設定は以下の通りです:

appに指定されているconfigの内容がちゃんと渡されているかデバッグで確認してみると良いかなと思いました。
print(app.config["MYSQL_USER"])など(HOST,USER,など)
下のリンク先のドキュメントだとPythonのクラスとして設定内容を定義していると思うのですが、「自分で試したこと」の記載はそうなっているのかどうかな?と思いました。

設定の処理の仕方(Configuration Handling) — Flask Documentation (2.2.x)

見当違いでしたらごめんなさい・・

投稿2024/08/12 07:12

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bqbq

2024/08/12 07:42

ありがとうございます!! 大変助かります。 さっそくやってみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問