実践
Python によるデータベース入門
MySQL, MongoDB, CouchDB の基本操作からアプリプログラミングまで
野

巖【著】

コロ

ナ社

博士（工学） 藤コロナ社

5.3

プログラム例 ― テーブルの作成とデータ入力 ―(base) C:¥Users¥fujino¥python3user¥MySQL>python ch5ex2.py
information_schema
jikanwaribase
mysql
performance_schema
salesbasesampledb
systestbase
todoufukenbase

79

実行結果

《実行結果の解説》

ナ社

サーバーにあるデータベースの一覧が表示され，その中には sampledb が作成されていることが確認できる。

5.3

プログラム例― テーブルの作成とデータ入力 ―例題 5 . 2 では，データベースを作成することができたので，ここでは，その続きとして，テーブルを作成して，そのテーブルにデータを入力するプログ

ロ

ラム例を以下に示す。

【例題 5 . 3】 下記仕様要求を実現する Python プログラムを作成せよ。

コ仕様要求（ 1 ） MySQL サーバーの sampledb への接続を行う。
（ 2 ） SQL 命令「テーブルを作成する」を実行する。
（ 3 ） SQL 命令「テーブルにデータ入力する」を実行する。
（ 4 ） SQL 命令「テーブルのデータを表示する」を実行する。
（ 5 ）（ 4 ）の結果を画面に表示する。
（ 6 ） サーバーにコミットする。
（ 7 ） 接続を切断する。
この問題について，まず基本的な解答を解答 1 に示す。そしてそれをさらに改良したものを解答 2 に示す。

5.

80

Python による MySQL プログラム【解答 1】 基本的な解答。SQL 命令文を 1 行ずつ投入する。

28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:

ソースコード# コネクターを作成
config = {'host': 'localhost','port': '3306','user': 'root','password': 'rootmysql','database': 'sampledb'}

ナ社

dbconnector = mysql.connector.connect(**config)# 接続できているかどうか確認
if dbconnector.is_connected():print('データベースへの接続が成功しました。')
else:
print('データベースへの接続が失敗しました。')
exit(1)# cursor オブジェクトの生成
cursor = dbconnector.cursor(buffered=True)

ロ

26:
27:

# データベースにテーブル作成
import mysql.connector# 属性 id, name, gender, age を持つテーブルを作成 , データ入力 , 問い合わせcursor.execute("DROP TABLE IF EXISTS memberlist;")cursor.execute("CREATE TABLE memberlist ( mid INT, nameCHAR(20), gender CHAR(10), age INT, PRIMARY KEY (mid) );")
cursor.execute("INSERT INTO memberlist VALUES ( 1, '田中花子','女', 28);")cursor.execute("INSERT INTO memberlist VALUES ( 2, '山田聡','男', 32);")
cursor.execute("INSERT INTO memberlist VALUES ( 3, '佐藤美那子','女', 21);")
cursor.execute("INSERT INTO memberlist VALUES ( 4, '鈴木博','男', 25);")# コミットする
dbconnector.commit()

コ

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

# 問い合わせcursor.execute("SELECT * FROM memberlist;")# すべてのデータを取得 , 表示
tuples = cursor.fetchall()

5.3
39:
40:
41:
42:
43:
44:

プログラム例 ― テーブルの作成とデータ入力 ―81

print("テーブル memberlist のデータ：")for tpl in tuples:
print(tpl)# 接続を切断dbconnector.close()〔ファイル名：ch5ex3a.py〕《ソースコードの解説》
2:

MySQL にアクセスするためのライブラリを読み込む。
MySQL サーバーに接続するための接続先とアカウント情報を記述する。こ4〜10:

こでは，例題 5 . 2 で作成した sampledb を接続先に指定する。
所定の接続情報を使って，MySQL サーバーに接続する。

16〜20:

ナ社

13:

接続が成功したかどうか確認する。成功した場合は，成功のメッセージを表示する。失敗した場合は，失敗のメッセージを表示して終了する。

23:

カーソルオブジェクトを作成する。

26:

カーソルで SQL 命令文「DROP TABLE IF EXISTS memberlist」を実行する。テー27:

カ ー ソ ル で SQL 命 令 文「CREATE TABLE memberlist ( mid INT, name

ブル memberlist が存在するならば，それをいったん削除する。

ロ

CHAR(20), gender CHAR(10), age INT, PRIMARY KEY (mid) );」を実行する。
テーブル memberlist を生成する。
28:

カーソルで SQL 命令文「INSERT INTO memberlist VALUES ( 1, '田中花子', '女',コ28)"」を実行する。テーブル memberlist にデータを挿入する。
29〜31:

28 行目と同じく，ほか 3 名のデータを挿入る。

33:

MySQL サーバーに実際に変更を書き込む。

36:

カーソルで SQL 命令文「SELECT * FROM memberlist」を実行する。テーブル内にあるデータを表示する。

38:

カーソルから実行結果を取得して，tuples に代入する。

40〜41:
44:

tuples の中身を表示する。

接続を切断する。

(base) C:¥Users¥fujino¥python3user¥MySQL>python ch5ex3a.py
データベースへの接続が成功しました。
テーブル memberlist のデータ：(1, '田中花子', '女', 28)(2, '山田聡', '男', 32)

実行結果

5.

82

Python による MySQL プログラム(3, '佐藤美那子', '女', 21)(4, '鈴木博', '男', 25)《実行結果の解説》
実行結果にはテーブル memberlist の 4 件のデータが表示されている。問題の要求が実現されていることが確認できる。

【解答 2】 解答 1 の改良版。
改良点 1：複数行の SQL 命令文をまとめて投入する。
改良点 2：データを csv ファイルに保存して，そこから読み込んで，データ# データベースにテーブル作成# SQL 命令文をまとめて実行# csv ファイルからデータを読み込む

ソースコードimport mysql.connector
import csv

ロ# コネクターを作成
config = {'host': 'localhost','port': '3306','user': 'root','password': 'rootmysql','database': 'sampledb'}
dbconnector = mysql.connector.connect(**config)

コ

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:

ナ社

ベースのテーブルに書き込む。

# 接続できているかどうか確認
if dbconnector.is_connected():print('データベースへの接続が成功しました。')
else:
print('データベースへの接続が失敗しました。')
exit(1)# cursor オブジェクトの生成
cursor = dbconnector.cursor(buffered=True)# 属性 id, name, gender, age を持つテーブルを作成 , データ入力
operation = (5.3

プログラム例 ― テーブルの作成とデータ入力 ―83"DROP TABLE IF EXISTS newlist;""CREATE TABLE newlist ( mid INT, name CHAR(20), gender
CHAR(10), age INT, PRIMARY KEY (mid) ); "32: )33:
34: # SQL 命令文を実行
35: results = cursor.execute(operation, multi=True)
36: for res in results:
37:
print(res)38:39: operation = ("INSERT INTO newlist VALUES (%s, %s, %s, %s);")
40: seqs = []41: with open('newlistdata.csv', encoding='utf-8') AS f:
42:
reader = csv.reader(f)43:
for row in reader:44:
tuple=(int(row[0]), row[1], row[2], int(row[3]))45:
seqs.append(tuple)46:
47: #executemany() で実行する
48: cursor.executemany(operation, seqs)
49: # コミットする
50: dbconnector.commit()
51:
52: # 問い合わせ
53: cursor.execute("SELECT * FROM newlist")
54: # 問い合わせ結果の全てのデータを取得、表示
55: tuples = cursor.fetchall()56: print("テーブル newlist のデータ：")
57: for tpl in tuples:
58:
print(tpl)
59:
60: # 接続を切断
61: dbconnector.close()

コロナ社

30:
31:

〔ファイル名：ch5ex3b.py〕

データファイル1, 田中花子 , 女 , 28
2, 山田聡 , 男 , 32
3, 佐藤美那子 , 女 , 21
4, 鈴木博 , 男 , 25

〔ファイル名：newlistdata.csv〕《ソースコードの解説》
5:

MySQL にアクセスするためのライブラリを読み込む。

5.

84
6:

Python による MySQL プログラム

csv ファイル用のライブラリを読み込む。

8〜26:

解答 1 の 5〜23 行と同じなので，ここでは省略する。

29〜32:

つぎにまとめて実行する SQL 命令文を用意して，operation に代入しておく。中身は，解答 1 の 26，27 行で実行した SQL 命令文と同じ。ただし，テーブル名を newlist に変更した。

35:

用意された operation を実行して，その結果を results に代入する。

36〜37:
39:

results の中身を表示する。

つぎに実行する SQL 命令文を用意する。今回の SQL 命令は以下の通りである。
ただし，%s のところに，命令の実行時に，データが代入される。
INSERT INTO newlist VALUES (%s, %s, %s, %s);

40〜45:

ファイル newlistdata.csv からデータを読み込んで，INSERT 文を実行する

ナ社

ためのデータ seqs を作成する。
48:

用意された operation を実行する。ここでは excute . many( ) 関数を呼び出して，データをまとめたリスト seqs を，操作 operation に渡して実行した。

50:

MySQL サーバーに実際に変更を書き込む。

52〜61:

解答 1 の 35〜44 行と同じなので，ここでは省略する。

コロ(base) C:¥Users¥fujino¥python3user¥MySQL>python ch5ex3b.py 実行結果
CMySQLCursorBuffered: DROP TABLE IF EXISTS newlist
CMySQLCursorBuffered: CREATE TABLE newlist (mid INT, name CHA...
テーブル newlist のデータ：(1, '田中花子', '女', 28)(2, '山田聡', '男', 32)(3, '佐藤美那子', '女', 21)(4, '鈴木博', '男', 25)《実行結果の解説》
実行結果にはテーブル newlist の 4 件のデータが表示されている。問題の要求が実現されていることが確認できる。
このようなやり方を用いると，テーブルのデータを変更するとき，プログラムのソースコード変更することなく，データファイルのみの変更で対応できるようになる。

5.4

プログラム例― 簡単な問い合わせ ―これまでに，Python のプログラムから，データベースの作成，テーブルのインスタンス
オブジェクト894【か行】

実体関連モデル
射影演算
集約関数
主キー
情 報
スキーマ
正規化
正規形
設計問題
選択演算
属 性

7, 94
38469729101
10193
38
6

【た行】

第 1 正規形101
第 2 正規形106
第 3 正規形
107
タプル
7
単純条件
28
直積集合
6
データ
1―の耐久性12
データベース
4
データベース管理システム 4
データベースサーバー
4
データベースシステム
4
データベース本体
4

ロ

1093
97
9637
995
105
8, 94
100
4658

コ

概念スキーマ
概念設計
外部キー
外部スキーマ
関 係
関係演算
関係スキーマ
関係データベース
関係データモデル
関数従属性
関 連
基本表
グループ化
交差結合

引

【さ行】

サービスの永続性
3 層スキーマ構造
自然結合
実 体

12960
7, 94
◇

【C, E】
Chen 記法
CouchDB
ER 図
ER モデルデータモデル
テーブル
問い合わせ等結合
トップダウンアプローチ
トランザクション

ナ社

【あ行】

索

【な行】

内部スキーマ

10

【は行】

ビュー
188
物理設計
93
複合条件
33
部分集合
6
ボトムアップアプローチ 94

【ま行】
目的表

100

【や行】
予約語

18

【ら行】
列 名
論理設計

1793

◇

【J, M, N】
95
1495
75728
59
94
11

JSON
Map
MongoDB
NoSQL【R, S】
134
188
1414Reduce
REST
SQL

188
174
12

著者略歴

ナ社

1991 年 東 海大学大学院工学研究科博士課程修了
博士（工学）
1994 年 東海大学短期大学部講師
2001 年 東海大学短期大学部助教授
2004 年 イ
 ギリス・サウサンプトン大学客員教授～05 年
2007 年 東海大学短期大学部教授
2008 年 東 海大学情報通信学部教授
現在に至る
 ランス海軍アカデミー招聘研究員
2016 年 フ～17 年

実践 Python によるデータベース入門―MySQL, MongoDB, CouchDB の基本操作からアプリプログラミングまで―
Perfect Practice An Introduction to Database with Python―MySQL, MongoDB and CouchDB from Basic Operation to Application Programming―Ⓒ Iwao Fujino 2020

著者
発 行 者

コ検印省略

初版第１刷発行

★

ロ2020 年 8 月 28 日

印 刷 所
製 本 所

藤野
巖
株式会社
コ ロ ナ 社
代 表 者
牛 来 真 也壮光舎印刷株式会社株式会社
グ リ ー ン

112―0011 東京都文京区千石 4―46―10発 行 所 株式会社 コ ロ ナ 社
CORONA PUBLISHING CO., LTD.
Tokyo Japan

振替00140―8―14844・電話（03）3941―3131（代）
ホームページ https://www.coronasha.co.jp

ISBN 978-4-339-02912-3

C3055

Printed in Japan（松岡）＜出版者著作権管理機構 委託出版物＞
本書の無断複製は著作権法上での例外を除き禁じられています。複製される場合は，そのつど事前に，出版者著作権管理機構（電話 03-5244-5088，FAX 03-5244-5089，e-mail: info@jcopy.or.jp）の許諾を得てください。

本書のコピー，スキャン，デジタル化等の無断複製・転載は著作権法上での例外を除き禁じられています。
購入者以外の第三者による本書の電子データ化及び電子書籍化は，いかなる場合も認めていません。
落丁・乱丁はお取替えいたします。