2012年5月30日水曜日

[python]MySQLdb

pythonでMySQLdbを使ってMySQLに接続したかった。
簡単なはずなのにけっこうハマった。
windows7 pro + traclightning という環境が仇になった。。。


traclightning インスコしてると 環境変数 PATH に TRACPATH が設定されてて、
これによってpython2.6にパスが通ってる。
なので TRACPATH の python周りのパスを外した。

※環境変数触るとき Rapid Environment Editor 使ってる。ちょっと楽。管理者権限で実行しないと値を変更できないよ。

で、python2.5なら
http://sourceforge.net/projects/mysql-python/files/
http://sourceforge.net/projects/mysql-python/files/mysql-python/
http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.2/
あたりにWindows用のexeがある。

python2.5でもよかったんだけれど、
http://www.codegood.com/archives/129
にpython2.7 Windoes用のexeがあったんで2.7を使うことにした。

ちなみにsetup.py build とか install やると
error: Unable to find vcvarsall.bat
で怒られて
http://stackoverflow.com/questions/2817869/error-unable-to-find-vcvarsall-bat
mingw云々でめんどくさなったので放置。
あとmysql_root ってクライアントツールのパスなん?ってのがよくわからんかったのでさらに放置。
http://techracho.bpsinc.jp/baba/2010_04_01/1286

で、元に戻ると、python2.7インスコしてなかったらexeからYesYesYesしてインスコ。
環境変数の設定で PYTHONHOMEで インストールディレクトリ C:\Python27 を指定しつつ、PATH に
%PYTHONHOME%\
%PYTHONHOME%\Scripts
%PYTHONHOME%\DLLs\
%PYTHONHOME%\Lib
%PYTHONHOME%\Lib\lib-tk
%PYTHONHOME%\Lib\site-packages
を追加。

where python とか python --version でパスやバージョンを確認しとく。
2.7が実行されてればOK。
なってなかったらコマンドプロンプト一回落とすとかOS再起動とかして環境変数ちゃんと設定されていたらパスも変わる。

んで、easy_install 使って楽したいので python ez_setup.py を実行してインスコ。

これでpython2.7環境できたので、

http://www.codegood.com/archives/129
から落としてきたexe実行してYesマンする。

import sys
print sys.path とかでpython2.7のsite-packagesにパス通ってるかみとくといいかも。
ImportError: No module named MySQLdb
とかなっちゃからね。

したらば、次のコードでselectしてみる。
http://taichino.com/programming/1259


#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
print sys.path

import MySQLdb
from MySQLdb.cursors import DictCursor

def process_row(row):
    print row

con = MySQLdb.connect(host='192.168.X.X', db='XXX', user='XXX', passwd='XXX', charset="utf8")

# SELECT
cur = con.cursor()                        # connectionから取得したcursorからsqlを発行する
print cur.execute('SELECT * FROM ur.diaries')  # executeは行数を返却
res = cur.fetchall()                      # fetchone, fetchmany, fetchallで結果取得
for row in res:
    process_row(row)                        # 各行はtuple (10L, 'Book A', 1000L, None)


文字コード的なところが…。
ちゃんと文字コード指定したらいけるみたい。
文字コード指定してなかったらselectの結果、日本語文字列が??????になってたけど
ちゃんと指定したらユニコード文字になってた。

updateとかinsertもきっといけるだろう。

もうおなかいっぱい。

0 件のコメント:

コメントを投稿