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. | 編集

FreeBSD 11.0 + CodeIgniter 3でMariaDBに接続

FreeBSD 11.0にPHP7とMariaDB 10.1をインストールしました。

FreeBSD 11 nginx + php7-fpmの動作環境構築(pkg使用)
FreeBSD 11.0にMariaDB 10.1をインストールし外部接続を許可する(pkg使用)


php7からMariaDBへの接続を試してみます。
フレームワークとして、CodeIgniterを使用しました。



ライブラリのインストール



phpからはmysqliを使用して接続しようと思います。
pkgコマンドで、php70-mysqliをインストール。


# pkg install php70-mysqli




これだけで大丈夫だろうと思っていたら、接続時にこんなエラーが発生しました。


An uncaught Exception was encountered

Type:        Error
Message:     Call to undefined function ctype_digit()
Filename:    /var/dev/php/ci3/system/database/DB_driver.php
Line Number: 1404




http://php.net/manual/ja/function.ctype-digit.php

ctypeライブラリが追加で必要な模様。


# pkg install php70-ctype




これでエラーはなくなります。




CodeIgniter



登録、検索のテスト用に「test」データベースを作成。
sampleテーブルを作成しておきます。


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




ローカルのtestデータベースに
id:admin
pass:P@ssw0rd
で接続します。

データベース接続の設定ファイル
application/config/database.php
はこうなりました。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. $active_group = 'default';
  4. $query_builder = TRUE;
  5. $db['default'] = array(
  6.     'dsn'    => '',
  7.     'hostname' => 'localhost',
  8.     'username' => 'admin',
  9.     'password' => 'P@ssw0rd',
  10.     'database' => 'test',
  11.     'dbdriver' => 'mysqli',
  12.     'dbprefix' => '',
  13.     'pconnect' => FALSE,
  14.     'db_debug' => (ENVIRONMENT !== 'production'),
  15.     'cache_on' => FALSE,
  16.     'cachedir' => '',
  17.     'char_set' => 'utf8',
  18.     'dbcollat' => 'utf8_general_ci',
  19.     'swap_pre' => '',
  20.     'encrypt' => FALSE,
  21.     'compress' => FALSE,
  22.     'stricton' => FALSE,
  23.     'failover' => array(),
  24.     'save_queries' => TRUE
  25. );





サンプルのコントローラー。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     public function index() {
  4.         $this->load->database();
  5.         
  6.         $this->db->empty_table('sample');
  7.         
  8.         $this->db->insert('sample', ['id' => 1, 'val' => 'テスト1']);
  9.         $this->db->insert('sample', ['id' => 2, 'val' => 'テスト2']);
  10.         
  11.         $rows = $this->db->get('sample')->result_array();
  12.         foreach($rows as $row) {
  13.             echo 'id:' . $row['id'] . ',val:' . $row['val'] . PHP_EOL;
  14.         }
  15.         
  16.     }
  17. }




実行してみると...


# php index.php sample
id:1,val:テスト1
id:2,val:テスト2




ちゃんとデータの登録・取得が行えているようです。

関連記事

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

  1. 2017/03/20(月) 19:03:00|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

FreeBSD 11.0にMariaDB 10.1をインストールし外部接続を許可する(pkg使用)

FreeBSD 11.0にMariaDB 10.1をインストールしてみます。

FreeBSD 11.0のインストール
FreeBSD 11.0-RELEASEを仮想環境(UbuntuのKVM)にインストール

MariaDBのインストール
FreeBSD 10.0にMariaDB 10をインストールする(pkg install使用)

それぞれ参考にしています。



MariaDB 10.1



pkg searchしてみると、mariadb101-serverの指定でインストールできそうです。


# pkg search mariadb
mariadb100-client-10.0.29     Multithreaded SQL database (client)
mariadb100-server-10.0.29     Multithreaded SQL database (server)
mariadb101-client-10.1.21     Multithreaded SQL database (client)
mariadb101-server-10.1.21     Multithreaded SQL database (server)
mariadb55-client-5.5.54_1     Multithreaded SQL database (client)
mariadb55-server-5.5.54_1     Multithreaded SQL database (server)





MariaDB 10.1をインストール。


# pkg install mariadb101-server




/etc/rc.confを編集。


# vi /etc/rc.conf




mysql_enable="YES"を追記し、起動許可を与えます。


hostname="freebsd11"
keymap="jp.106.kbd"
ifconfig_re0="inet 192.168.1.101 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
sshd_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"
mysql_enable="YES"




mariadbを起動。
※コマンドはmysql-serverですが...


# service mysql-server start




デフォルトでrootパスワードは設定されていません。
ユーザー:root、パスワード無しで接続できます。


# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.21-MariaDB FreeBSD Ports

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>



10.1.21がインストールできたようです。





文字コードの変更



文字コードを調べてみると、デフォルトは相変わらずlatin1のようです。


MariaDB [(none)]> show variables like "char%";
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database | latin1                         |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | latin1                         |
| character_set_system     | utf8                             |
| character_sets_dir     | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)




/usr/local/share/mysql/my-large.cnfを/usr/local/etc/my.cnfにコピー。
編集します。


# cp /usr/local/share/mysql/my-large.cnf /usr/local/etc/my.cnf
# vi /usr/local/etc/my.cnf




項目を追記します。


# The following options will be passed to all MariaDB clients
[client]
#password     = your_password
port            = 3306
socket         = /tmp/mysql.sock
default-character-set=utf8mb4


# The MariaDB server
[mysqld]
port            = 3306
socket         = /tmp/mysql.sock
character-set-server=utf8mb4
skip-character-set-client-handshake
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M




編集がおわったらMariaDBをリスタート。


# service mysql-server restart




ちゃんとutf8mb4に変更できました。


MariaDB [(none)]> show variables like "char%";
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8mb4                         |
| character_set_connection | utf8mb4                         |
| character_set_database | utf8mb4                         |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                         |
| character_set_server     | utf8mb4                         |
| character_set_system     | utf8                             |
| character_sets_dir     | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)







外部接続の許可



別の端末から接続できるようにしておきます。


MariaDB [(none)]> grant all privileges on *.* to admin@'%' identified by 'P@ssw0rd' with grant option;
MariaDB [(none)]> grant all privileges on *.* to admin@localhost identified by 'P@ssw0rd' with grant option;



※2行めはローカルアクセス時の制限。
MariaDB 5.5の外部接続許可


これで、
ユーザー名:admin
パスワード:P@ssw0rd
で接続できるようになりました。


関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/03/20(月) 18:24:27|
  2. MySQL
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

FreeBSD 11 nginx + php7-fpmの動作環境構築(pkg使用)

FreeBSD 11を仮想環境にインストールしました。
FreeBSD 11.0-RELEASEを仮想環境(UbuntuのKVM)にインストール


pkgコマンドでnginxとphp7をインストールしてみます。


nginx



pkg searchしてみると、nginx,nginx-full,nginx-liteというバージョンがありました。


# pkg update
# pkg search nginx
nginx-1.10.2_3,2             Robust and small WWW server
nginx-devel-1.11.7             Robust and small WWW server
nginx-full-1.10.2_3,2         Robust and small WWW server (full package)
nginx-lite-1.10.2_3,2         Robust and small WWW server (lite package)
nginx-naxsi-1.10.2_3,2         Robust and small WWW server (plus NAXSI)
p5-Nginx-ReadBody-0.07_1     Nginx embeded perl module to read and evaluate a request body
p5-Nginx-Simple-0.07_1         Perl 5 module for easy to use interface for Nginx Perl Module
p5-Test-Nginx-0.25             Testing modules for Nginx C module development




今回はベーシックなnginx(無印)をインストールしました。


# pkg install nginx





rc.confを編集。


# vi /etc/rc.conf




nginx_enable="YES"を追加して起動許可を与えます。


hostname="freebsd11"
keymap="jp.106.kbd"
ifconfig_re0="inet 192.168.1.101 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
sshd_enable="YES"
nginx_enable="YES"





nginxを起動。


# service nginx start




http://[サーバーIP]をブラウザで表示して、以下の内容が表示されればインストール成功です。

734_01.png





php7のインストール



php7.0をインストールします。
※このパッケージにphp-fpmも同梱されています。


# pkg install php70




PHP 7.0.17がインストールできました。


# php -v
PHP 7.0.17 (cli) (built: Mar 18 2017 01:18:20) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies




rc.confを編集。


# vi /etc/rc.conf




php_fpm_enable="YES"を追加してphp-fpmに起動許可を与えます。


hostname="freebsd11"
keymap="jp.106.kbd"
ifconfig_re0="inet 192.168.1.101 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
sshd_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"





php-fpmを起動します。


# service php-fpm start








nginx.confの編集



php-fpmはデフォルトで127.0.0.1:9000で待ち受けるように構成されています。


# vi /usr/local/etc/php-fpm.d/www.conf

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
; 'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000





nginx.confを編集。
拡張子phpのアクセスは、127.0.0.1:9000(php-fpm)へ転送するよう構成します。


# vi /usr/local/etc/nginx/nginx.conf




編集内容の抜粋です。


http {

(略)

    server {

(略)

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        # コメントを外して有効化。一部パラメーターを微調整
        location ~ \.php$ {
            root         /usr/local/www/html;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

    }

}




設定を変更したら、nginxをリスタート。


# service nginx restart




テスト用のphpプログラムを作成します。


# mkdir -p /usr/local/www/html
# vi /usr/local/www/html/info.php




info.phpの内容は以下のとおり。


  1. <?php phpinfo();




ブラウザで、http://[サーバーIP]/info.phpを表示してみます。

734_02.png


うまく動いてくれたようです。




php-fpmのlistenをソケットに変更



php-fpm、デフォルトでは127.0.0.1:9000をリッスンしていますが、
UNIXソケットでの待受に変更してみます。

php-fpmの設定ファイルを編集。


# vi /usr/local/etc/php-fpm.d/www.conf




ソケットを/var/run/phph-fpm.socketに作成。
listenするowner,groupをwwwに変更します。


;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.socket


; Set listen(2) backlog.
; Default Value: 511 (-1 on FreeBSD and OpenBSD)
;listen.backlog = 511

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = www
listen.group = www
listen.mode = 0660





続いて、nginx.confを編集。


# vi /usr/local/etc/nginx/nginx.conf




編集内容の抜粋です。


http {

(略)

    server {

(略)

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        # コメントを外して有効化。一部パラメーターを微調整
        location ~ \.php$ {
            root         /usr/local/www/html;
            #fastcgi_pass 127.0.0.1:9000;
            fastcgi_pass unix:/var/run/php-fpm.socket;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

    }

}




php-fpm,nginxのサービスを再起動。


# service php-fpm restart
# service nginx restart




これでソケットでの待受に変更できました。




関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/03/20(月) 18:01:38|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

FreeBSD 11 rootのssh接続の有効化

FreeBSD 11を仮想環境にインストールしました。
FreeBSD 11.0-RELEASEを仮想環境(UbuntuのKVM)にインストール

別の端末からrootでssh接続できるように変更します。



sshd_configの編集



sshの設定ファイル/etc/ssh/sshd_configを適当なエディタで開きます。
今回はviを使用しました。


vi /etc/ssh/sshd_config




設定ファイル中、


#PermitRootLogin no



となっている箇所を探します。
先頭のコメント「#」を削除して、noをyesに変更。


PermitRootLogin yes




ファイルを保存したら、sshdサービスを再起動。


/etc/rc.d/sshd restart




これで別の端末からrootでssh接続できるようになりました。
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/03/20(月) 15:51:20|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ