
ずっと書籍を読みながら勉強してきましたが、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文とかも同じ感じでいけるやろ。明日ぐらいにテスト結果を追記します