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にログインでき、作成したデータベースの情報を取得することができました。
コメント