概要
HerokuのClearDBを使ってMySQLに接続しようとpythonのプログラムをプッシュして動かしてみたのですが、error 2055 Lost connection~
というメッセージが出て接続できませんでした。
結果としてはMySQLに関するエラーではなく、プログラムの書き方が原因だったのですが、同じところで悩んでいる方のためにもまとめておこうと思います。
環境
- macOS
- python3.7.1
- MySQL5.6.47
- mysql-connector-python
この記事で書かないこと
- ClearDBの設定方法
- MySQLの詳しい操作方法
原因
最初はClearDBを追加した後、何か設定が必要なのだと思い色々調べて、マイグレーションなどを試していました。
しかし、ClearDB自体には接続できて、データベースに繋いで操作するプログラム単体で動かしてもエラーは出ず、いまいち原因が分かりませんでした。
そんな時にこちらの記事を見つけなんとなく読んでいたのですが、SQL操作が失敗する原因としてコネクション切断後にクエリ実行する場合と書いてありました。
それは当然だよなと思い次に行こうとしたのですが、ふと自分のコードを見てこれこそが原因だと判明しました。
というのも、私のコードは下記のような作りになっていました。
#モジュールのインポート
#データベース操作のプログラムのインポート
import database
#メインの処理
#database内の関数呼び出し
database.get_data()
import mysql.connector
#接続先を設定して接続
def get_data():
#クエリの実行
connection.commit()
connection.close()
これを踏まえてこちらの記事を見てみると、database
をインポートした時点で関数外に記載されているコードが実行されます。
つまり、main.py
のimport database
で一旦SQLに接続されますが、database.py
のget_data()
関数は定義がしてあるだけなので実行はされず、最後のconnection.close()
で接続が切られるという流れになります。
その後に、main.py
内のdatabase.get_data()
で関数を呼び出したところで、既に接続は切られているので当然クエリは実行できずエラーが発生するということです。
database.py
だけ実行しても、接続後何もせず接続を切るという動作をしていただけなのでエラーが出ないのも納得です。
対策
というわけでコードを下記のように修正し、関数を呼び出すことで接続を切るようにしたら無事にエラーなく接続できました。
#モジュールのインポート
#データベース操作のプログラムのインポート
import database
#メインの処理
#database内の関数呼び出し
database.get_data()
#追加
database.close_db()
import mysql.connector
#接続先を設定して接続
def get_data():
#クエリの実行
#修正
def close_db()
connection.commit()
connection.close()