メモ:レンタルサーバー上のMySQLにPythonでデータの出し入れ操作を行う
PythonでMySQLを操作する
バリューサーバーのMySQLをPythonで操作する方法についてのメモ
MySQLのテーブルは予め作成しておく
テーブルの作成はPythonコードからも行えますが、そう何度も変更するものではないので、大量にテーブルを作成する場合などでなければ、ブラウザ上の操作で予めテーブルを作成しカラムの設定も行っておくのがよいかと思います。
バリューサーバーではphpMyAdminにログインすることでブラウザ上からDBを操作できます。
MySQLへの接続を確認するコード
import pymysql.cursors connection = pymysql.connect(host='localhost', user='DBユーザー名', password='DBパスワード', db='DB名', charset='utf8', cursorclass=pymysql.cursors.DictCursor) connection.close()
デフォルトではMySQLからtuple型でデータが返ってきますが「cursorclass=pymysql.cursors.DictCursor」の部分で扱いやすいDictionary型で受け取るように変更しています。
このコードでエラーがでなければ接続できています。
FlaskのテンプレートエンジンでMySQLから返ってきた結果を表示する
connection = pymysql.connect(host='localhost', user='XXXXXXX', password='XXXXXXX', db='XXXXXXX', charset='utf8', cursorclass=pymysql.cursors.DictCursor) with connection.cursor() as cursor: sql = "SELECT * FROM テーブル名 WHERE novel_id = %s"%novel_number cursor.execute(sql) # Select結果を取り出してリストに収納していく novel_ranking_date_list=[] results = cursor.fetchall() for r in results: #結果を一行ずつリストに収納していく novel_ranking_date_list.append(r) return render_template("output_template.html",novel_ranking_date_list=novel_ranking_date_list)
Pythonコード側ではFor文によって、MySQLから返ってきた辞書オブジェクト形式のデータをリストにappendしていく。
こうすることによって、テンプレートエンジンの{% for i in range(10) %}で扱えるようになる
<h3>ランキング掲載データ</h3> <table class="center"> <tbody> {% for i in range(10) %} <tr> <td align="center"> <a href="https://mirunovel.com/n_log/index.cgi/story/?story={{ novel_ranking_date_list[i]['novel_id'] }}">{{ novel_ranking_date_list[i]['title'] }}</a> </td> </tr> {% endfor %} </tbody> </table>
トラブルシューティング
OperationalError: (2003, "Can't connect to MySQL server on 'サーバードメイン' (timed out)")
原因:サーバーは存在しているがアクセスが通っていない。
多くのレンタルサーバーの場合、外部IPからの接続はデフォルトで拒否する設定となっているため接続できない。
解決:外部接続ではなく、同じサーバー上にあるwebサーバーから「Localhost」宛に内部接続する
Date型が省略される
MySQLのDate型は「日にち」までしか収納できない(例:2019-9-9)
もし「時刻」まで収納したい場合は、カラムの属性を「Datetime」に変えることで秒単位まで収納出来るようになる。
INT型が省略される
デフォルトのINT型ではツイッターのツイートIDの様な「10桁に収まらない整数」は収納されない。
代わりに「BIGINT型」をカラムに指定することで収納できるようになる。