UbuntuにおいてpythonでMariaDBにアクセスする方法

UbuntuにおいてpythonでMariaDBにアクセスする方法をご紹介します。

条件

  • Ubuntu 16.04 LTSを使用。
  • MariaDBがインストール済み。

Ubuntuにおけるpython

Ubuntu 16.04 LTSにはPython 3.5/Python 2.7がインストールされており、そのままで利用可能です。
https://www.python.jp/install/ubuntu/index.html

pythonバージョンを確認すると、以下のように表示されます。

$ python --version
Python 2.7.12
$ python3 --version
Python 3.5.2

Pythonの実行にはそれぞれ以下のコマンドを使用します。

  • python2.7を使用する場合
    • python
  • python3.5を使用する場合
    • python3

pip3のインストール

mysql-connector-pythonをインストールするためにpip3を使用します。
(python2用のmysql-connector-pythonをインストールするにはpipを使用します)

pip3の存在確認

pip3のコマンドを打つとインストールされていない旨のメッセージが出力されることがあります。

$ pip3
プログラム 'pip3' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt install python3-pip

以下のコマンドでpip3をインストールします。

sudo apt install python3-pip

pip3のインストール確認

以下のコマンドでpip3がインストールされたことを確認します。

$ which pip3
/usr/bin/pip3

mariaDB(mysql)に接続するためのドライバをインストール

以下のコマンドでインストールします。

$ sudo pip3 install mysql-connector-python

インストールされると以下のようなメッセージが出力されます。

Collecting mysql-connector-python
  Downloading https://files.pythonhosted.org/packages/21/98/583597f6026d88737466294297d4d9127372d55708bdaee62578e90f1709/mysql_connector_python-8.0.12-cp35-cp35m-manylinux1_x86_64.whl (8.2MB)
    100% |????????????????????????????????| 8.2MB 148kB/s
Collecting protobuf>=3.0.0 (from mysql-connector-python)
  Downloading https://files.pythonhosted.org/packages/bf/d4/db7296a1407cad69f043537ba1e05afab3646451a066ead7a314d8714388/protobuf-3.6.1-cp35-cp35m-manylinux1_x86_64.whl (1.1MB)
    100% |????????????????????????????????| 1.1MB 1.1MB/s
Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/lib/python3/dist-packages (from protobuf>=3.0.0->mysql-connector-python)
Requirement already satisfied (use --upgrade to upgrade): six>=1.9 in /usr/lib/python3/dist-packages (from protobuf>=3.0.0->mysql-connector-python)
Installing collected packages: protobuf, mysql-connector-python
Successfully installed mysql-connector-python-8.0.12 protobuf-3.6.1
You are using pip version 8.1.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

ついでに

pipのバージョンが古いというメッセージが出たので更新しておきます。

$ sudo pip3 install --upgrade pip

アップデートが行われると以下のようなメッセージが出力されます。

Collecting pip
  Downloading https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl (1.3MB)
    100% |????????????????????????????????| 1.3MB 918kB/s
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Not uninstalling pip at /usr/lib/python3/dist-packages, outside environment /usr
Successfully installed pip-18.0

pipのバージョンを確認すると18.0に更新されたようです。

$ pip --version
pip 18.0 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

MariaDBでの操作

以下のコマンドを打ってパスワードを入力してMariaDBにログインします。

$ mysql -u root -p
Enter password:

DB作成

テスト用のDB「testPythonDB」を作成します。

MariaDB [(none)]> CREATE DATABASE testPythonDB;

DBに文字コード設定

ついでに文字コードも設定しておきます。

MariaDB [(none)]> ALTER DATABASE testPythonDB DEFAULT CHARACTER SET=utf8;

ユーザ作成

ユーザ「userPython」を作成します。

MariaDB [(none)]> GRANT ALL PRIVILEGES ON testPythonDB.* TO 'userPython'@'localhost' IDENTIFIED BY 'xxxxxxxx';

作成したユーザを確認します。

MariaDB [(none)]> SELECT Host, User, Password FROM mysql.user WHERE user='userPython';
+-----------+------------+-------------------------------------------+
| Host      | User       | Password                                  |
+-----------+------------+-------------------------------------------+
| localhost | userPython | *3F8CA14479942E6498364DCD7857D60DA6193498 |
+-----------+------------+-------------------------------------------+

DBのテーブル確認

以下のコマンドで作成した「testPythonDB」に入ります。

MariaDB [(none)]> USE testPythonDB
Database changed

以下のコマンドでテーブル一覧を表示します。
未だテーブルを作成していないため空という結果が返ります。

MariaDB [testPythonDB]> show tables;
Empty set (0.00 sec)

PythonによるDB操作

DB側の準備が整いましたので、いよいよPythonによるDB操作を行っていきます。

テーブル作成

テーブル「user」を作成します。
任意のディレクトリに「createTest.py」というファイルを作成し、以下の内容を記述します。

import mysql.connector

db=mysql.connector.connect(host="localhost", user="userPython", password="xxxxxxxx", database="testPythonDB")
cursor=db.cursor()

cursor.execute("""CREATE TABLE IF NOT EXISTS user(
                id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(64),
                email VARCHAR(64));""")
db.commit()

cursor.close()
db.close()

Python実行

作成したPythonファイルを実行します。
特にエラーが出力されなければOKです。

$ python3 createTest.py

DB確認

DBを確認します。
先ほど作成したユーザでMariaDBに入ります。

$ mysql -u userPython -p
Enter password:

DB一覧を確認します。

MariaDB [(none)]> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testPythonDB       |
+--------------------+
2 rows in set (0.00 sec)

testPythonDBに入ります。

MariaDB [(none)]> USE testPythonDB

テーブル一覧を確認します。
userテーブルが作成されていることがわかります。

MariaDB [testPythonDB]> SHOW tables;
+------------------------+
| Tables_in_testPythonDB |
+------------------------+
| user                   |
+------------------------+
1 row in set (0.00 sec)

カラムを確認します。
想定通りのカラムが作成されていることがわかります。

MariaDB [testPythonDB]> SHOW columns FROM user;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(64)      | YES  |     | NULL    |                |
| email | varchar(64)      | YES  |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

INSERTのサンプル

INSERTのサンプル用ファイル(insertTest.py)を作成します。

import mysql.connector

db=mysql.connector.connect(host="localhost", user="userPython", password="xxxxxxxx", database="testPythonDB")
cursor=db.cursor()

add_user = ("insert into user "
            "(id, name, email) "
            "values (%s, %s, %s)")

data_user1 = ('1', 'user1', 'user1@mail.com')
data_user2 = ('2', 'user2', 'user2@mail.com')
data_user3 = ('3', 'user3', 'user3@mail.com')

# レコード追加
cursor.execute(add_user, data_user1)
cursor.execute(add_user, data_user2)
cursor.execute(add_user, data_user3)
# コミット
db.commit()

query = ("select * from user")

# レコード取得
cursor.execute(query)

for (id, name, email) in cursor:
    print("id:{}, name:{}, email:{}".format(id, name, email))

cursor.close()
db.close()

実行結果

$ python3 insertTest.py
id:1, name:user1, email:user1@mail.com
id:2, name:user2, email:user2@mail.com
id:3, name:user3, email:user3@mail.com

DB確認

MariaDB [testPythonDB]> select * from user;
+----+-------+----------------+
| id | name  | email          |
+----+-------+----------------+
|  1 | user1 | user1@mail.com |
|  2 | user2 | user2@mail.com |
|  3 | user3 | user3@mail.com |
+----+-------+----------------+
3 rows in set (0.00 sec)

UPDATEのサンプル

UPDATEのサンプル用ファイル(updateTest.py)を作成します。

import mysql.connector

db=mysql.connector.connect(host="localhost", user="userPython", password="xxxxxxxx", database="testPythonDB")
cursor=db.cursor()

update_user = ("update user "
            "set name = %s, email = %s"
            "where id = %s")

data_update1 = ('update1', 'update1@mail.com', '1')
data_update3 = ('update3', 'update1@mail.com', '3')

# レコード更新
cursor.execute(update_user, data_update1)
cursor.execute(update_user, data_update3)
# コミット
db.commit()

query = ("select * from user")

# レコード取得
cursor.execute(query)

for (id, name, email) in cursor:
    print("id:{}, name:{}, email:{}".format(id, name, email))

cursor.close()
db.close()

実行結果

$ python3 updateTest.py
id:1, name:update1, email:update1@mail.com
id:2, name:user2, email:user2@mail.com
id:3, name:update3, email:update1@mail.com

DB確認

MariaDB [testPythonDB]> select * from user;
+----+---------+------------------+
| id | name    | email            |
+----+---------+------------------+
|  1 | update1 | update1@mail.com |
|  2 | user2   | user2@mail.com   |
|  3 | update3 | update1@mail.com |
+----+---------+------------------+
3 rows in set (0.00 sec)

DELETEのサンプル

DELETEのサンプル用ファイル(deleteTest.py)を作成します。

import mysql.connector

db=mysql.connector.connect(host="localhost", user="userPython", password="xxxxxxxx", database="testPythonDB")
cursor=db.cursor()

delete_user = ("delete user from user "
            "where id in (%s, %s)")

data_delete1 = ('1', '2')

# レコード削除
cursor.execute(delete_user, data_delete1)
# コミット
db.commit()

query = ("select * from user")

# レコード取得
cursor.execute(query)

for (id, name, email) in cursor:
    print("id:{}, name:{}, email:{}".format(id, name, email))

cursor.close()
db.close()

実行結果

$ python3 deleteTest.py
id:3, name:update3, email:update1@mail.com

DB確認

MariaDB [testPythonDB]> select * from user;
+----+---------+------------------+
| id | name    | email            |
+----+---------+------------------+
|  3 | update3 | update1@mail.com |
+----+---------+------------------+
1 row in set (0.00 sec)

エラーハンドルなどのサンプル

エラーハンドルなどのサンプル用ファイル(sample.py)を作成します。

import mysql.connector
from mysql.connector import errorcode

def print_all_records(cursor):
    # レコード取得
    query = ("select * from user")
    cursor.execute(query)

    for (id, name, email) in cursor:
        print("id:{}, name:{}, email:{}".format(id, name, email))


config = {
    'user': 'userPython',
    'password': 'xxxxxxxx',
    'host': 'localhost',
    'database': 'testPythonDB',
    'raise_on_warnings': True
}

try:
    db=mysql.connector.connect(**config)
except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong with your user name or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exist")
    else:
        print(err)
else:
    cursor=db.cursor()

    ### レコードをすべて削除
    print("Delete all records.")
    delete_user_all = ("delete user from user")
    # 実行
    cursor.execute(delete_user_all)
    # コミット
    db.commit()

    # レコード確認
    print_all_records(cursor)

    ### レコード追加
    print("=== Add three records. ===")
    add_user = ("insert into user "
            "(id, name, email) "
            "values (%s, %s, %s)")

    data_user1 = ('1', 'user1', 'user1@mail.com')
    data_user2 = ('2', 'user2', 'user2@mail.com')
    data_user3 = ('3', 'user3', 'user3@mail.com')

    # 実行
    cursor.execute(add_user, data_user1)
    cursor.execute(add_user, data_user2)
    cursor.execute(add_user, data_user3)
    # コミット
    db.commit()

    # レコード確認
    print_all_records(cursor)

    ### レコード更新
    print("=== Update records. ===")
    update_user = ("update user "
            "set name = %s, email = %s"
            "where id = %s")

    data_update1 = ('update1', 'update1@mail.com', '1')
    data_update3 = ('update3', 'update1@mail.com', '3')

    # 実行
    cursor.execute(update_user, data_update1)
    cursor.execute(update_user, data_update3)
    # コミット
    db.commit()

    # レコード確認
    print_all_records(cursor)

    ### レコード削除
    print("=== Delete records. ===")
    delete_user = ("delete user from user "
            "where id in (%s, %s)")

    data_delete1 = ('1', '2')

    # 実行
    cursor.execute(delete_user, data_delete1)
    # コミット
    db.commit()

    # レコード確認
    print_all_records(cursor)

    cursor.close()
    db.close()

実行結果

$ python3 sample.py
Delete all records.
=== Add three records. ===
id:1, name:user1, email:user1@mail.com
id:2, name:user2, email:user2@mail.com
id:3, name:user3, email:user3@mail.com
=== Update records. ===
id:1, name:update1, email:update1@mail.com
id:2, name:user2, email:user2@mail.com
id:3, name:update3, email:update1@mail.com
=== Delete records. ===
id:3, name:update3, email:update1@mail.com

参考

mysql-connector-pythonの使用方法詳細は以下のサイトをご確認ください。

https://dev.mysql.com/doc/connector-python/en/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です