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/