ずっと書籍を読みながら勉強してきましたが、mysqlへ接続するような、そんな話が出てきませんでした…。いやいや、いちいちcsv使うのか?普通はデータ持ってきて簡単にデータをセットして分析するもんだろ?と思っていたので、イライラしておりました。しょうがないので、mysqlへの接続方法を自分で調べることにしましたので、今回もメモ書きを行いたいと思います。

mysql-connector-pythonライブラリをインストールする

なんだよ、Anacondaを入れてればなんでもできるんじゃないんかいと思いつつ、ライブラリをインストールしろと言われる以上、インストールしようと思います。

#現在、anacondaの環境でactivateしてます

$ pip install mysql-connector-python

Collecting mysql-connector-python
  Downloading https://files.pythonhosted.org/packages/45/3b/341aa07480f2c2809db15495013de991b25423a29c198d433785d1809c31/mysql_connector_python-8.0.17-cp37-cp37m-macosx_10_13_x86_64.whl (4.2MB)

〜〜〜〜〜
〜〜〜〜〜

Successfully installed mysql-connector-python-8.0.17 protobuf-3.9.1

何言ってるのかわからんけど、Successfullyって言ってんだから、成功したんでしょう。
この単語だけはわかりやすくてすばらしいですね。

では、早速mysqlをpython側から操作をしてみます

テーブルを作ってみる

ユーザーやパスワード情報は別ファイルで一元管理がいいと思うのはさておき、テストなので本文中に入れて記載します。

import mysql.connector
HOST='192.168.11.31'
USER='webtopi'
PASSWORD='#######'
DATABASE='test_db'

try:
 db = mysql.connector.connect(user=USER,password=PASSWORD,host=HOST,database=DATABASE)

 db.autocommit = False

 sql='create table test_db.test_table(id int(11) auto_increment,word varchar(20) binary,primary key(id))'

 cursor = db.cursor(prepared=True)
 cursor.execute(sql)

except:
 db.rollback()

finally:
 cursor.close()
 db.close()

#実行するとテーブルができる。

commitの実行がなくてもできましたね。。

データを入れてみる


import mysql.connector
HOST='192.168.11.31'
USER='webtopi'
PASSWORD='#######'
DATABASE='test_db'

word_array=['犬','猫','人間']

try:
 db = mysql.connector.connect(user=USER,password=PASSWORD,host=HOST,database=DATABASE)

 db.autocommit = False

 for word in word_array:
  sql='insert into test_db.test_table(word) values(%s)'
  cursor = db.cursor()
  cursor.execute(sql,(word,))

 db.commit()
except mysql.connector.Error as e:
 db.rollback()

finally:
 cursor.close()
 db.close()

はい、ちゃんとinsertできました。commitを実行しない場合、データが入らなかったです。トランザクションはしっかりスタートしてるようです。

あと、今回のソースで、(word,)の部分を最初はwordにしてたところ、
ValueError: Could not process parameters
というエラーを吐き出しました。要素が1つの場合、最後に,がないとだめなんですね。

データを取得してみる

今度は入れたデータを取得してみます。

import mysql.connector
HOST='192.168.11.31'
USER='webtopi'
PASSWORD='#######'
DATABASE='test_db'

try:
 db = mysql.connector.connect(user=USER,password=PASSWORD,host=HOST,database=DATABASE)

 db.autocommit = False

 sql='select * from test_db.test_table'
 cursor = db.cursor()
 cursor.execute(sql)
 data=cursor.fetchall();

 for d in data:
  print(d)

except mysql.connector.Error as e:
 db.rollback()

finally:
 cursor.close()
 db.close()

#実行結果
(4, '犬')
(5, '猫')
(6, '人間')

ちゃんとデータがとれました。よかった。。。。か?PHPで、fetchallした場合って、カラム名と一緒に出てきていたはずですが。。。出てきていませんね。左から順に取れてるだけです。これは困った。要は、dic型で出てこないと困るんですが。。

調べたところ、cursorのオプションでなんとかなるらしいですね。
ちょっと書き換えました


import mysql.connector
HOST='192.168.11.31'
USER='webtopi'
PASSWORD='#######'
DATABASE='test_db'

try:
 db = mysql.connector.connect(user=USER,password=PASSWORD,host=HOST,database=DATABASE)

 db.autocommit = False

 sql='select * from test_db.test_table'
 cursor = db.cursor(dictionary=True)
 cursor.execute(sql)
 data=cursor.fetchall();

 for d in data:
  print(d)

except mysql.connector.Error as e:
 db.rollback()

finally:
 cursor.close()
 db.close()

#実行結果
{'id': 4, 'word': '犬'}
{'id': 5, 'word': '猫'}
{'id': 6, 'word': '人間'}

そうそう、これこれ!これでええんや!ちゃんとfor文の中で名前指定して吐き出せるか、for文を以下に変更してチェックや!

 for d in data:
  print(d["id"],':::',d["word"])

#実行結果
4 ::: 犬
5 ::: 猫
6 ::: 人間

よし!いい感じ!

たぶん、update文とかも同じ感じでいけるやろ。明日ぐらいにテスト結果を追記します

コメント