Symfoware

Symfowareについての考察blog

PythonからMariaDB(MySQL)に接続する(mysql-connector-python)

PythonからMariaDB 10に接続してみます。
以前はMySQLdbを使用していたのですが、今回はmysql-connector-pythonを試してみます。

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


Pythonを動かす端末はUbuntu 16.04。
MariaDBが動いているサーバーはFreeBSD 11.0 + MariaDB 10.1です。

ここで使用した環境です。
http://symfoware.blog68.fc2.com/blog-entry-1966.html



pipによるインストール



pipをインストールしていない場合はインストール。
続いて、mysql-connector-pythonをインストールします。


$ sudo apt install python-pip
$ sudo pip install mysql-connector




mysql.connectorをimport出来るか試してみます。


$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mysql.connector
>>>







接続サンプル



MariaDB側には「test」データベースに「sample」テーブルを作成済です。


  1. create table sample(
  2.     id int,
  3.     val varchar(100)
  4. );




接続情報は以下の通り。


server ip:192.168.1.101
id:admin
password:P@ssw0rd





データベースに接続し、登録や検索を行うサンプルはこんな感じになります。


  1. # -*- coding:utf-8 -*-
  2. import mysql.connector
  3. # データベース接続
  4. con = mysql.connector.connect(
  5.     host='192.168.1.101',
  6.     db='test',
  7.     user='admin',
  8.     passwd='P@ssw0rd'
  9. )
  10. # 辞書型カーソル取得
  11. cur = con.cursor(dictionary=True)
  12. # データの削除
  13. cur.execute('delete from sample')
  14. # 登録(すっぴん)
  15. cur.execute("insert into sample (id, val) values (1, 'テスト1')")
  16. # 登録(プレースフォルダ)
  17. cur.execute("insert into sample (id, val) values (%s, %s)", [2, 'テスト2'])
  18. # 登録(一括)
  19. insert_values = [
  20.     [3, 'テスト3'],
  21.     [4, 'テスト4'],
  22.     [5, 'テスト5']
  23. ]
  24. cur.executemany("insert into sample (id, val) values (%s, %s)", insert_values)
  25. # コミットして変更を確定
  26. con.commit()
  27. # 検索
  28. cur.execute("select * from sample")
  29. # 表示
  30. for row in cur:
  31.     print("id:%d, val:%s" % (row['id'], row['val']))
  32. # 切断
  33. cur.close()
  34. con.close()




カーソル取得時、dictionary=Trueとすることで、フィールド名をキーとした辞書型でデータが取り出せます。
これを指定していないと配列でのデータ取得となるため、
row[0], row[1]のような指定でデータを参照することになります。

自動的にトランザクションが開始されているため、明示的にcommitしないと
変更が確定しません。


実行結果


$ python sample.py
id:1, val:テスト1
id:2, val:テスト2
id:3, val:テスト3
id:4, val:テスト4
id:5, val:テスト5







データ取得方法あれこれ



selectを実行した後のカーソルはそのままイテレートできます。


  1. # -*- coding:utf-8 -*-
  2. import mysql.connector
  3. # データベース接続
  4. con = mysql.connector.connect(
  5.     host='192.168.1.101',
  6.     db='test',
  7.     user='admin',
  8.     passwd='P@ssw0rd'
  9. )
  10. # 辞書型カーソル取得
  11. cur = con.cursor(dictionary=True)
  12. # 検索
  13. cur.execute("select * from sample")
  14. # 表示
  15. for row in cur:
  16.     print("id:%d, val:%s" % (row['id'], row['val']))





fetchoneで先頭のレコードを取り出せます。


  1. # -*- coding:utf-8 -*-
  2. import mysql.connector
  3. # データベース接続
  4. con = mysql.connector.connect(
  5.     host='192.168.1.101',
  6.     db='test',
  7.     user='admin',
  8.     passwd='P@ssw0rd'
  9. )
  10. # 辞書型カーソル取得
  11. cur = con.cursor(dictionary=True)
  12. # 検索
  13. cur.execute("select * from sample")
  14. # 最初の行を取得
  15. row = cur.fetchone()
  16. # 表示
  17. print("id:%d, val:%s" % (row['id'], row['val']))




$ python sample.py
id:1, val:テスト1




fetchoneすると読み込む行が1つ進みます。
次の行がない状態でfetchoneすると「None」になります。

fetchoneしながらすべての行を読み取るプログラムは
こんな感じになります。


  1. # -*- coding:utf-8 -*-
  2. import mysql.connector
  3. # データベース接続
  4. con = mysql.connector.connect(
  5.     host='192.168.1.101',
  6.     db='test',
  7.     user='admin',
  8.     passwd='P@ssw0rd'
  9. )
  10. # 辞書型カーソル取得
  11. cur = con.cursor(dictionary=True)
  12. # 検索
  13. cur.execute("select * from sample")
  14. # 最初の行を取得
  15. row = cur.fetchone()
  16. # データが取得できている間はループ
  17. while row:
  18.     # 表示
  19.     print("id:%d, val:%s" % (row['id'], row['val']))
  20.     # 次の行を読み取り
  21.     row = cur.fetchone()




$ python sample.py
id:1, val:テスト1
id:2, val:テスト2
id:3, val:テスト3
id:4, val:テスト4
id:5, val:テスト5




fetchallですべての行を変数に代入できます。


  1. # -*- coding:utf-8 -*-
  2. import mysql.connector
  3. # データベース接続
  4. con = mysql.connector.connect(
  5.     host='192.168.1.101',
  6.     db='test',
  7.     user='admin',
  8.     passwd='P@ssw0rd'
  9. )
  10. # 辞書型カーソル取得
  11. cur = con.cursor(dictionary=True)
  12. # 検索
  13. cur.execute("select * from sample")
  14. # すべての行を取得
  15. rows = cur.fetchall()
  16. for row in rows:
  17.     # 表示
  18.     print("id:%d, val:%s" % (row['id'], row['val']))




$ python sample.py
id:1, val:テスト1
id:2, val:テスト2
id:3, val:テスト3
id:4, val:テスト4
id:5, val:テスト5




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/03/23(木) 22:48:03|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C# exeファイルに後から設定値を埋め込む手法の検討 | ホーム | FreeBSD 11.0 + CodeIgniter 3でMariaDBに接続>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1967-0c55d8ea
この記事にトラックバックする(FC2ブログユーザー)