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

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のエラーコードがあるため、そこに注目する。