1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

HerokuでMySQLに接続しようとしたら[Error2055]が出た

Posted at

概要

HerokuのClearDBを使ってMySQLに接続しようとpythonのプログラムをプッシュして動かしてみたのですが、error 2055 Lost connection~というメッセージが出て接続できませんでした。

結果としてはMySQLに関するエラーではなく、プログラムの書き方が原因だったのですが、同じところで悩んでいる方のためにもまとめておこうと思います。

環境

  • macOS
  • python3.7.1
  • MySQL5.6.47
  • mysql-connector-python

この記事で書かないこと

  • ClearDBの設定方法
  • MySQLの詳しい操作方法

原因

最初はClearDBを追加した後、何か設定が必要なのだと思い色々調べて、マイグレーションなどを試していました。
しかし、ClearDB自体には接続できて、データベースに繋いで操作するプログラム単体で動かしてもエラーは出ず、いまいち原因が分かりませんでした。

そんな時にこちらの記事を見つけなんとなく読んでいたのですが、SQL操作が失敗する原因としてコネクション切断後にクエリ実行する場合と書いてありました。
それは当然だよなと思い次に行こうとしたのですが、ふと自分のコードを見てこれこそが原因だと判明しました。

というのも、私のコードは下記のような作りになっていました。

main.py
#モジュールのインポート

#データベース操作のプログラムのインポート
import database

#メインの処理
    #database内の関数呼び出し
    database.get_data()
database.py
import mysql.connector

#接続先を設定して接続

def get_data():
    #クエリの実行

connection.commit()
connection.close()

これを踏まえてこちらの記事を見てみると、databaseをインポートした時点で関数外に記載されているコードが実行されます。

つまり、main.pyimport databaseで一旦SQLに接続されますが、database.pyget_data()関数は定義がしてあるだけなので実行はされず、最後のconnection.close()で接続が切られるという流れになります。

その後に、main.py内のdatabase.get_data()で関数を呼び出したところで、既に接続は切られているので当然クエリは実行できずエラーが発生するということです。

database.pyだけ実行しても、接続後何もせず接続を切るという動作をしていただけなのでエラーが出ないのも納得です。

対策

というわけでコードを下記のように修正し、関数を呼び出すことで接続を切るようにしたら無事にエラーなく接続できました。

main.py
#モジュールのインポート

#データベース操作のプログラムのインポート
import database

#メインの処理
    #database内の関数呼び出し
    database.get_data()

    #追加
    database.close_db()
database.py
import mysql.connector

#接続先を設定して接続

def get_data():
    #クエリの実行

#修正
def close_db()
    connection.commit()
    connection.close()

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?