MySQLのエラー『Traceback (most recent call last)』の解決方法

「Traceback (most recent call last)」はMySQL自体のエラーメッセージではなく、Pythonなどのプログラミング言語からMySQLにアクセスする際に発生する例外スタックトレース。MySQL接続ライブラリ(例:mysql-connector-python、PyMySQL、SQLAlchemyなど)を使ったコード実行時にエラーが発生すると、Pythonインタプリタがこの形式でエラー出力する。MySQL接続エラー、構文エラー、クエリ実行失敗、型不一致など、あらゆるレイヤでの問題が含まれる。
1. エラーの発生条件と典型的な例
PythonからMySQLに接続・クエリ実行時、設定やコードが正しくない場合に発生。
import mysql.connector
conn = mysql.connector.connect(
host="localhost",
user="wrong_user",
password="wrong_pass",
database="test"
)
このようなコードでは、認証エラーにより Traceback が出力される。
2. Tracebackの構造と読み方
Tracebackは、エラーがどの関数・行で発生したかをスタック形式で出力する。最下部に原因となる例外クラスが表示される。
Traceback (most recent call last):
File "sample.py", line 4, in
conn = mysql.connector.connect(…)
mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user 'wrong_user'@'localhost' (using password: YES)
「最下部のエラー行(ここでは ProgrammingError)」が最も重要。
3. 接続情報が間違っている場合
ホスト名、ユーザー名、パスワードが誤っていると接続できず、Tracebackに `Access denied` と表示される。
mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user
認証情報や MySQL のユーザー権限を確認。
4. データベース名が存在しない
指定されたデータベースが存在しない場合は `Unknown database` エラーになる。
mysql.connector.errors.ProgrammingError: 1049 (42000): Unknown database 'invalid_db'
SHOW DATABASES; で存在確認する。
5. クエリ構文エラー
SQLの文法ミスやサポートされていない構文を含んだクエリを実行すると構文エラーが出る。
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax
原因の SQL 文をログ出力するようにしておくと原因特定が早まる。
6. テーブルやカラムの存在しない場合
mysql.connector.errors.ProgrammingError: 1146 (42S02): Table 'mydb.unknown_table' doesn't exist
スペルミスや、開発環境と本番環境のスキーマの不一致が多い原因。
7. 型不一致やNULL制約違反
INSERT文などで不正な型を与えると `DataError` や `IntegrityError` が出る。
mysql.connector.errors.DataError: 1265 (01000): Data truncated for column 'age' at row 1
型チェックをコード側で行い、NULLや文字数制限を意識する。
8. 接続がタイムアウトする場合
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'host'
MySQLサーバが起動していない、ポートが違う、ネットワークでブロックされている、などが原因。
systemctl status mysqld
telnet 127.0.0.1 3306
9. コネクションプールの枯渇
長時間開きっぱなしのコネクションがあると、次の接続で `Too many connections` エラーが出る。
mysql.connector.errors.OperationalError: 1040 (08004): Too many connections
MySQL側の `max_connections` 設定と、アプリケーション側のコネクション管理を見直す。
10. サンプル:例外を補足してログを出力
Tracebackをユーザーに表示せず、ログに記録するには try/except を使う。
import mysql.connector
from mysql.connector import Error
try:
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="test"
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM unknown_table")
except Error as e:
print(f"MySQL Error: {e}")
finally:
if conn.is_connected():
conn.close()
このようにすることで、Tracebackを制御し、ログに情報を残せる。
11. SQLAlchemy利用時のエラー例
ORMであるSQLAlchemyでも、MySQL接続時には同様のTracebackが出力される。
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError)
(1049, "Unknown database 'nonexistent'")
ORM経由でのエラーも、根底にはMySQLのエラーコードがあるため、そこに注目する。
-
前の記事
CMD: ‘X’ is not recognized as a keyword の解決方法 2025.04.21
-
次の記事
Error: Callback was already called の解決方法 2025.04.21
コメントを書く