毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/7/1【9日目(前半)】Python3とMySQL8.0をConnectするだけでも大変

PythonMySQLを連携させるという流れでしたが、まずはローカルにデータベースがないと話にならないので、データベースをつくります。

> create datebase akb_tweet;
> use akb_tweet;

> create table tweet(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
created_data time unique,
name varchar(50) NOT NULL,
tweet text,
count_tweets int,
count_follows int,
count_followers int,
count_favolites int,
count_lists int, 
users_favorites int,
retweet int,
favorite int
);

idは一個ずつ自動的に繰り上がる数字を入力するようにAUTO_INCREMENTをつけています。 いろいろと問題が出てきそうですが、よく分かってもいないので一先ずこちらで実装していきたいと思います。

mysqlclientの導入

pythonMySQLを操作する際に候補としてあげられるのがmysqlclientらしいです。pipコマンドでインストールします。

pip install mysqlclient
import MySQLdb

mysql = MySQLdb.connect(db=“データベース名”,user=“MySQLのユーザー名”, passwd="MySQLのパスワード”, charset="utf8")

crsr = mysql.corsor()

crsr.commit()
crsr.close()

とりあえずは、最低限必要なものがこれらしいです。 上から順に

  • import MySQLdb :MySQLをインポート
  • mysql = MySQLdb.connect :プログラムとMySQLをとつなぐ
  • crsr = mysql.corsor() :MySQLのカーソルを取得
  • crsr.commit() :変更をコミット
  • crsr.close() :MySQLを閉じる

カーソルを取得、とはいったい何なんですかね? MySQLの公式ページに行くと、カーソルの項目はありますが、カーソルそのものが何なのかという説明はないですね。。。

MySQL は、ストアドプログラム内部のカーソルをサポートします。その構文は、組み込み SQL の場合と同様です。カーソルには次のプロパティーがあります。

wikipediaにカーソルのわかりやすい説明がありましたので引用。

一般にデータベースは、同じ種類のデータを数多く蓄積しており、利用者が求めるデータも1件だけではなく複数件になる可能性がある。このようなケースは、カーソルを使って以下のようにイテレータの要領で実現できる。 1. 利用者は検索条件やソート順序を指定してカーソルを定義する。 2. パラメータを利用している場合は値を決定し、データへのアクセスを開始する。 3. カーソル位置のデータを取得する。検索結果の終端なら7へ。 4. 必要に応じてカーソル位置のデータを変更・削除する。 5. カーソルを「次のデータ」へと進める。 6. 3から繰り返し。 7. 繰り返しの終了後、カーソルを解放する。 システムによっては5において、次のデータに進む以外に、ひとつ前のデータに戻ることも許している。

ようは行を指定するのに必要だそうですね。まぁ、よくよく考えてみれば、パソコン上で使うカーソルとほとんど同じ概念かもしれませんね。

あとはこの中でexecuteメソッドを使ってMySQLの中身を変更していけばいいそうです。ちなみにexecuteは「実行」という意味です。そのまんまですね。

取り敢えず、MySQLがインポートできるかコードを実行してみます。

import MySQLdb
 python sql_test.py
Traceback (most recent call last):
  File "sql_test.py", line 5, in <module>
    import MySQLdb
  File "/anaconda/lib/python3.6/site-packages/MySQLdb/__init__.py", line 19, in <module>
    import _mysql

うーん、エラー。このエラーは一通りいろいろやってみましたが解決できませんでした。Python3系に対応して指定ないだとか、バージョンがどうのこうのとか、何が悪いのか特定できずあきらめました。

MySQLに接続するライブラリは他にもありますので、mysqlclientを使うことにします。

pip3 install mysqlclient

import mysql.connector

こっちは問題なく実行できます。 importをmysql.connectorに書き替えて、Connectの中身を変更して実行してみます。

import mysql.connector

mysql = mysql.connector.connect (db=“データベース名”,user=“MySQLのユーザー名”, passwd="MySQLのパスワード”, charset="utf8")
crsr = mysql.corsor()

crsr.close()

実行結果。

db=mysql.connector.connect(**)
(中略)
"Authentication plugin '{0}' is not supported".format(plugin_name))

エラーでつながらない。これはMySQL8.0で追加されたchaching_sha2_passwordという新しいセキュリティの仕様がmysql.connectorで対応していないかららしいです(なんて酷いエラー)。 MySQLのmy.cnfをいじれば解決できるようなので、変更していきます。

mysql --help | grep my.cnf
vim /usr/local/etc/my.cnf

変更する(と、いうより追加する)箇所は下記のとおりです。

default_authentication_plugin= mysql_native_password

これで一先ず、エラーが出ず実行できました。