なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

メモ:レンタルサーバー上のMySQLにPythonでデータの出し入れ操作を行う

PythonMySQLを操作する

バリューサーバーのMySQLPythonで操作する方法についてのメモ

準備

pip

pip install PyMySQL

pythonMySQLを扱うためのモジュールはいくつか存在しますが、今回は「PyMySQL」を使用。

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型」をカラムに指定することで収納できるようになる。

参考にしたページ

www.dbonline.jp

www.dbonline.jp

MySQLの各種操作についての情報が充実