Python3 + mysql connectorを使って色んなパターンで接続する
Python3 mysql connector
本記事は、Python3で MySQLに繋ぐ方法を説明するページです。 久しぶりにPythonを触り、mysqlに繋ぐことになったので記事にします。
準備
pip install mysql-connector-python
or
pip3 install mysql-connector-python
[注意] mysql-connector-python-rf は更新が止まっていたので使わないようにします。
Sample code / snippet
注意!!!
" " で囲むとPassword Errorが発生して駄目です。 シングルクォートのみ対応しています。
超シンプル版
#!/usr/bin/env python import mysql.connector if __name__ == '__main__': cnx = mysql.connector.connect( user='root', host='localhost', password='XXXXXX',# ダブルクォートで囲っては駄目 database='XXXXXX' ) cnx.close()
超シンプルfile指定版
例えば、 ${HOME}/.my.cnf を使う場合
import mysql.connector import os if __name__ == '__main__': home = os.environ.get("HOME") cnx = mysql.connector.connect(option_files=home + '/.my.cnf') cnx.close()
通常版
<table_name>
に指定したtableに対して、DESCコマンド (e.g. DESC example_table;
)を使う例です。
#!/usr/bin/env python import mysql.connector def get_description_table(table): db_cursor = db_conn.cursor() sql = "DESC "+ table db_cursor.execute(sql) #desc_table = db_cursor.fetchone() desc_table = db_cursor.fetchall() db_conn.close() return desc_table def create_db_connection(): global db_conn db_conn = mysql.connector.connect( user='XXXX', password='XXXX', database='XXXX', port=3306 ) if __name__ == '__main__': print("DB test connect is started....") create_db_connection() print(get_description_table("<table_name>"))
本番用の例
実際に使いやすくするにはOptionで指定できたり、fileで指定できたり、Security面も気にした方が良いと思います。 その場合の例は以下になります。
#!/usr/bin/env python import argparse import mysql.connector def read_env_variables(): global args parser = argparse.ArgumentParser(description="read arguments") parser.add_argument("--HOST", type=str, help="HOST name", required=True) parser.add_argument("--USER", type=str, required=False, help="It is recommended not to use this. You can use MySQL conf.") parser.add_argument("--PASS", type=str, required=False, help="It is recommended not to use this. You can use your MySQL conf.") parser.add_argument("--CONF", type=str, required=False, default=os.environ.get("HOME") + "/.my.cnf", help="Default is ${HOME}/.my.cnf") parser.add_argument("--DATABASE", type=str, required=True) parser.add_argument("--PORT", type=int, required=False) args = parser.parse_args() print(args) def get_description_table(table): db_cursor = db_conn.cursor() sql = "DESC "+ table db_cursor.execute(sql) #desc_table = db_cursor.fetchone() desc_table = db_cursor.fetchall() db_conn.close() return desc_table def create_db_connection(): global db_conn db_conn = mysql.connector.connect( host=args.HOST, user=args.USER, passwd=args.PASS, database=args.DATABASE, port=args.PORT, option_files=args.CONF ) if __name__ == '__main__': read_env_variables() print("DB test connect is started....") create_db_connection() print(get_description_table("<table_name>"))
こんな感じです。
${HOME}/.my.cnf を使う場合は例えば以下のように設定しておきます。
[client]
user = xxxx
password = xxxx
# .. 省略
実行例
command.py --HOST=server1 --DATABASE=db
command.py --HOST=server1 --CONF=${HOME}/.tmp_my.cnf --DATABASE=db --PORT=13306
command.py --HOST=server1 --USER=ktykogm --PASSWORD=xxxxx --DATABASE=db
説明
parser.add_argument("--USER", type=str, required=False, help="It is recommended not to use this. You can use MySQL conf.") parser.add_argument("--PASS", type=str, required=False, help="It is recommended not to use this. You can use your MySQL conf.") parser.add_argument("--CONF", type=str, required=False, default=os.environ.get("HOME") + "/.my.cnf", help="Default is ${HOME}/.my.cnf") #... user=args.USER, passwd=args.PASS, #... option_files=args.CONF
の部分は、
コマンド実行時やpsコマンドの標準出力にPasswordを表示させないようにするためにも、上記のように ${HOME}/my.cnf
がデフォルトで指定されるようにしています。
(例えば、コマンド引数に環境変数を渡すだけだと表示されてしまいます。)
ただし、使用しなくなったら ~/.my.cnf
の削除はお忘れなく。