2018年11月20日火曜日

mysql-connector-pythonを使ったデータベースアクセス

Pythonのお勉強と言うか、作成と言うか、亀の歩みのごとく進んでおります。
ちょっと詰まってたところがあって、長期にわたって停滞していたのです。
それが今しがた解決したのでとりあえず記事を書いておこうという訳です。

まずは色々と参考にさせてもらったページたち
Pythonのfor文によるループ処理

Pythonで長い文字列を複数行に分けて書く

Pythonで日曜から始まる曜日を得る

皆さんお世話になりました。
あと何にそんなに詰まったかっていうと、データベースアクセスです。
もうほんと、基本中の基本なんですけど、言語が変わると分からない物ですね。
XAMPPに入ってるデータベースがMySQLなもんで、今までと勝手が同じという事でPythonからもMySQLを使いたいなと。
そんで、Oracleから公式で出てるPythonのMySQLパッケージmysql-connector-pythonを使ってアクセスしようと試みたんですが、エラーがずっと出てどうにもならなかったんですね。

まず以下の様に書いてエラーがずっと出てました
-----------------------------------------------------------------------------------
01 # -*- coding: utf-8 -*-
02 
03 #インポート
04 import mysql.connector
05 
06 #変数宣言
07 host = 'localhost'
08 user = 'root'
09 dbpw = ''
10 dbnm = 'test'
11 contents = 'SQL TEST<br />\n'
12
13 #処理
14 print("Content-Type: text/html\n")
15
16 # データベース接続とカーソル生成
17 conn = mysql.connector.connect(user, dbpw, host, dbnm, charset='utf8')
18 cur = conn.cursor()
19 
20 cur.execute("select * from test_table;")
21 
22 for row in cur.fetchall():
23     contents += str(row) + '\n'
24 
25 cur.close # 保存を実行
26 conn.close # 接続を閉じる
27 
28 print(contents)
----------------------------------------------------------------------------------- 

エラーが出ていたのは17行目。
どうやらmysql-connector-connectの接続部分はちゃんと決まった書き方があるみたいです。
17行目を以下に書き換えたら無事アクセスできました。
----------------------------------------------------------------------------------- 
conn = mysql.connector.connect(
    host='localhost',
    db='test',
    user='root',
    password='',
    charset='utf8'
)

----------------------------------------------------------------------------------- 
どうやら引数はちゃんと決まったキーネームがあるようで、dbnmとかじゃなくちゃんとdbって書かないといけないっぽい。
当然パスワードもdbpwじゃなくてpassword。
他の言語でのやり方をそのまま持ってきたら痛い目見ました。

原因の追究に役立ったのは機械学習の開発環境Jupyter。
これにソース投げて実行したらエラーを分かりやすく吐き出してくれたので、困ったときは使えそうです。

ちなみに実行時の環境は以下
Windows10 Pro
WinPython 3.6.6.2Qt5
XAMPP 1.8.1
Apache 2.4.3
MySQL 14.14 Distrib 5.5.27

0 件のコメント:

コメントを投稿