Cucco’s Compute Hack

コンピュータ関係の記事を書いていきます。

PythonからMySQLを操作する

構築

Python3.4とMySQL5.7を利用。

Pythonを先に入れておく。Python のバージョンは、Connectorの対応バージョンと合わせておく。

MySQLのインストール時には、rootユーザのパスワードの設定が必要。ここでは、passwordとします。

Connector

http://dev.mysql.com/downloads/connector/python/

Connector自体は、MySQLインストーラに含まれている様子。

準備

データベースを作ります。

スタートメニューにいる”MySQL 5.7 Command Line Client - Unicode”を開いて、ログイン。

最初はこんな感じのデータベースがある。show databases;がコマンド。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.00 sec)

データベースを作ります。create database testdb;がコマンド。testdbがデータベース名。

mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| testdb             |
| world              |
+--------------------+
7 rows in set (0.00 sec)

テストコード

pythonで以下を実行

# -*- coding: utf-8

import mysql.connector

config = {
    'user': 'root',
    'password': 'password',
    'host': 'localhost',
    'database':'testdb',
    'charset':'utf8'
}
cnx = mysql.connector.connect(**config)
cur = cnx.cursor(buffered=True)

sql = 'DROP TABLE IF EXISTS pet;'
cur.execute(sql)
cnx.commit()

sql = 'CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);'
cur.execute(sql)
cnx.commit()

# select
cur.execute('SELECT * FROM pet;')
row = cur.fetchone()

sql = 'INSERT INTO pet VALUES (%s, %s, %s, %s, %s, %s);'
data= ('Puffball','Diane','hamster','f','1999-03-30',None)
cur.execute(sql, data)

sql = 'INSERT INTO pet VALUES (%s, %s, %s, %s, %s, %s);'
data= ('Puffball','Diane','hamster','m','1999-03-30',None)
cur.execute(sql, data)
cnx.commit()

# select
cur.execute('SELECT * FROM pet;')
row = cur.fetchall()

# 出力
for i in row:
	print(i)

cur.close()
cnx.close()

実行結果

C:\Python34>python C:\Python34\msql_test.py
('Puffball', 'Diane', 'hamster', 'f', datetime.date(1999, 3, 30), None)
('Puffball', 'Diane', 'hamster', 'm', datetime.date(1999, 3, 30), None)

MySQL 5.7 Command Line Clientでテーブル定義の情報を見てみると

mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> select * from pet;
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
| Puffball | Diane | hamster | m    | 1999-03-30 | NULL  |
+----------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)

メモ

データベースを作っておかないと、Pythonから接続ができません。

NULL値を入れたい場合は、Noneを入れておけばよい様子。

cnx.commit()がないと、Insertが反映されません。

エラーコードと原因

パスワード間違い

mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

データベースが見つからない

mysql.connector.errors.ProgrammingError: 1049 (42000): Unknown database 'foo'

すでにテーブルがある

mysql.connector.errors.ProgrammingError: 1050 (42S01): Table 'pet' already exists