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の使用方法詳細は以下のサイトをご確認ください。

