MySQL Connectorを使用しPythonでVirtualBox (CentOS7)にインストールしたMySqlに接続する

MySQL Connectorを使用しPythonでVirtualBox (CentOS7)にインストールしたMySqlに接続してみます。

MySQL Connectorは、Pythonの標準ライブラリではありませんので、事前にインストールしておく必要があります。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■環境

・Mysql Version 5.7.32
・Centos7
・VirtualBox6.1

■MySQL Connectorを使用する前にデータベース、テーブル、データの準備を行う。

VirtualBox(Centos7)を起動させて、Mysqlにログイン。

create database test;

ログイン後、上記のコマンドを入力し、Enterを押します。

use mydb;

押すと、新しいデータベースが作成されるので、作成されたデータベースを選択するために、上記のコマンドを入力し、Enterを押します。

create table user (id char(10), name char(20));

Enterキーを押すと、作成されたデータベースを選択した状態になるので、新しいテーブルを作成するために、上記のコマンドを入力し、Enterキーを押します。

insert into user values ('01', 'test');

押すと、新しいテーブルが作成されます。作成されたテーブルに情報を登録するために、上記のコマンドを入力し、Enterキーを押します。

これで、準備は完了となります。

■MySQL Connectorを使用しMySqlに接続する

では、次にMySQL Connectorを使用しMySqlに接続するスクリプトを書いていきます。

■コード

import mysql.connector

conn = mysql.connector.connect(user='ユーザー名', password='パスワード名', host='ホスト名', database='データベース名')
cur = conn.cursor()

cur.execute("select * from user;")

for row in cur.fetchall():
    print(row[0],row[1])

cur.close
conn.close

mysql.connectorを呼び出して、mysql.connector.connect()で接続をセットアップし、MySQLサーバーとのセッションを確立する。

conn.cursor()で、カーソルオブジェクトを作成し execute メソッドでクエリを実行する。

クエリを実行後、データベース内の情報を取得し、print関数で出力する。

■実行

今回のスクリプトを「mysql-data.py」という名前で保存し、コマンドプロンプトから実行してみます。

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

実行してみると、「mysql.connector.errors.ProgrammingError」というエラーが発生しました。

■対処方法

「mysql.connector.errors.ProgrammingError」というエラーを対処してみます。

・ファイアウォールの設定

Mysqlにログアウトした状態で下記のコマンドを入力し、ファイアウォールの設定を変更する。権限がない場合はsudo権限に変更する。

firewall-cmd --list-services --zone=public --permanent
firewall-cmd --add-service=mysql --zone=public --permanent
firewall-cmd --reload
firewall-cmd --list-services --zone=public --permanent

・MySQLからユーザーに特権を付与する

ファイアウォールの設定後、

mysql -h localhost -u root -p

MySqlにログインするために、上記のコマンドを入力し、Enterキーを押します。

GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY '(パスワード)';

ログインした後に、「mysql.connector.errors.ProgrammingError」というエラーはユーザーのアクセスが拒否されたことによるものなので、任意のホスト (%) からuserまでのすべてのデータベースに対する完全な権限を付与してみますので、上記のコマンドを入力し、Enterキーをして権限を付与します。パーミッションを付与する際に、このサーバがインターネットからアクセスできるかどうかに注意する必要があります。

・ipアドレスを確認する

権限を付与した後に、1度MySQLをログインします。

ip a

ログイン後、ipアドレスを確認するために、上記のコマンドを入力し、Enterキーを押します。

Enterキーを押すと、ipアドレスが表示されますので、この情報を記録しておきます。

・スクリプトを変更する

■コード

import mysql.connector

conn = mysql.connector.connect(user='権限を付与したユーザー名', password='パスワード', host='ipアドレス', database='test')
cur = conn.cursor()

cur.execute("select * from user;")

for row in cur.fetchall():
    print(row[0],row[1])

cur.close
conn.close

エラーが発生したスクリプトを、上記のスクリプトに変更し、保存します。

保存後、実行してみると、VirtualBox (CentOS7)にインストールしたMySqlにログインでき、作成したデータベースの情報を取得することができました。

コメント

タイトルとURLをコピーしました