見出し画像

PythonのプログラムからMySQLデータベースサーバーに接続

今日は、『実践Pythonによるデータベース入門』の5.1節 ―PythonからMySQLデータベースに接続する―で学んだことをアウトプットします。

PythonのプログラムからSQL命令文を実行するために、まずMySQLデータベースサーバーに接続する必要があります。なお、接続するためのアカウント情報を事前に用意しなければなりません。

【例題5.1】

下記仕様要求を実現するPythonプログラムを作成せよ。

仕様要求
MySQLデータベースサーバーへの接続を行い、その結果を表示する

まず、本書に書かれている、以下のコードを実行してみます。

# MYSQlサーバーへの接続
import mysql.connector

config = {
   'user': 'root',
   'password': 'rootmysql',
   'host': 'localhost'
}

# try〜except文でエラー対処
try:
   dbconnector = mysql.connector.connect(**config)

# 例外が発生の場合、エラーメッセージを表示
except mysql.connector.Error as errmsg:
   print('MySQLサーバーへの接続が失敗しました。')
   print('エラーメッセージ:', errmsg)

# 成功した場合、メッセージを表示、接続を切断
else:
   print('MySQLサーバーへの接続が成功しました。')
   dbconnector.close()

​以下のようなエラーメッセージが…

ModuleNotFoundError: No module named 'mysql'

mysql-connector-pythonライブラリがインストールできていない?

本書の「付録」には、OSがWindowsで、IDEがVSCodeの場合での、インストール方法が記載されているので、これを自分の環境(OSがUbuntuで、IDEがPyCharm)に置き換えていけばいいのかなと考えました。

が、あれこれ検索して色々試したのですが、ますますわからなくなったので、PyCharmで実行することは諦めました。

代わりに、『Head First Python』での学習時の環境(OSがUbuntuと、IDEではなくテキストエディタのAtom)で再度チャレンジすることにしました。

以前、『Head First Python』での学習時に、既にmysql-connector-pythonをpipでインストールしています。

気を取り直して、ターミナルから、.pyファイルを実行。

$ /DBbyPython$ python3 5_1.py 
MySQLサーバーへの接続が失敗しました。
エラーメッセージ: 1698 (28000): Access denied for user 'root'@'localhost'

rootユーザーを利用したことが原因なのでしょうか?
root以外のユーザーを設定することにします。
その前に、先にデータベースを作成する必要がありますね。

データベースを作成する操作は、次の例題5.2になり、5.2では5.1と同様に最初にMySQLサーバーへの接続から始めるので、ここは5.1を飛ばして、5.2に取り組むことで、5.1も同時に取り組んだことにします。

【例題5.2】

下記仕様要求を実現するPythonプログラムを作成せよ。

仕様要求
(1)MySQLサーバーへの接続を行う。
(2)データベースsampledbを作成する
(3)サーバーにあるデータベース一覧を取得し、それを表示する。

上記の仕様要求を実現することは諦めて、以下の手順を踏んで(3)だけを実行するように変更。

(1)' コマンドラインでsampledbを作成する
(2)’ コマンドラインで新規ユーザーsampleuserを作成し、sampleuserにsampledbに対するすべての権限を与える。
(3)サーバーにあるデータベース一覧を取得し、それを表示する

(1)' コマンドラインでsampledbを作成する

mysql> CREATE DATABASE sampledb;
Query OK, 1 row affected (0.60 sec)

(2)’ コマンドラインで新規ユーザーsampleuserを作成し、sampleuserにsampledbに対するすべての権限を与える。

新規ユーザー「sampleuser」を作成し、パスワードを設定したのですが、エラーが…

mysql> CREATE USER sampleuser identified by 'hogehoge';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

ポリシー要求に合わせるのが面倒なので、こちらを参考に、ポリシー要求を変更することにしました。

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.52 sec)

上記のようになっているのを、下記のように変更。

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 8     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | LOW   |
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+

これで、特殊文字がなくても、大文字、小文字両方使わなくてもパスワードが設定できます。

mysql> CREATE USER sampleuser identified by 'hogehoge';
Query OK, 0 rows affected (0.22 sec)

sampleuserにsampledbに対するすべての権限を与えます。

mysql> grant all on sampledb.* to 'sampleuser';
Query OK, 0 rows affected (0.22 sec)

(3)サーバーにあるデータベース一覧を取得し、それを表示する

# MYSQlサーバーへの接続
import mysql.connector

dbconfig = {
   'user': 'sampleuser',
   'password': 'hogehoge',
   'host': 'localhost',
   'database': 'sampledb',
}

# try〜except文でエラー対処
try:
   dbconnector = mysql.connector.connect(**dbconfig)

# 例外が発生の場合、エラーメッセージを表示
except mysql.connector.Error as errmsg:
   print('MySQLサーバーへの接続が失敗しました。')
   print('エラーメッセージ:', errmsg)
   exit(1)

# cursorオブジェクトの生成
cursor = dbconnector.cursor()

# SQL命令文を実行
cursor.execute('SHOW databases')

# 実行結果データを取得、表示
tuples = cursor.fetchall()
for tpl in tuples:
   print(tpl[0])

# 接続を切断する
dbconnector.close()

実行結果は以下のようになり、データベースの一覧が表示されました。

$ python3 5_1.py 
information_schema
sampledb


サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪