サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(4)-pymysql
- 公開日: 2014/06/29(日) 10:42[JST]
手順としてはこんな感じ
準備
con = pymysql.connect( host='接続先のIPアドレス', port=ポート番号, db='データベース名', user='ユーザ名', passwd='パスワード', charset='utf8mb4') cur = con.cursor()
connectメソッドとcursorメソッドを順番に実行。connectメソッドのcharsetはMySQL(or MariaDB)の設定に応じて適宜変更する。
SELECT
if cur.execute('SELECT ~')!=0: result = cur.fetchall()
まずexecuteしてfetchall。executeメソッドの返り値はヒットしたレコード数。resultは通常二次元のタプル。ヒットしたレコードが0の時は(一次元の)空タプル。一つのレコードだけ取り出したいときは下記のようにfetchoneメソッドを使う。
cur.execute('SELECT ~') count = 1 result = [] while True: row = cur.fetchone() if row is None: break elif count % 2 == 1: result.append(row) count += 1
上記のソースの場合、奇数番目のレコードのみをresultリストに追加している。fetchmany(size=1)という複数(引数sizeで行数を指定)のレコードを取り出すメソッドもある。
INSERT、UPDATE、DELETE
cur.execute('INSERT INTO~') con.commit()
executeし、次いでコネクションのcommitメソッドを使ってDBに反映させる。
DB切断
cur.close() con.close()
(2015/3/22追記)
SQLインジェクションを避けるためプレースホルダを使う方がよさそう。つまり、
cur.execute('SELECT * FROM table1 WHERE col1 = %s AND col2 = %s', (var1, var2))
みたいに、executeメソッドに二つパラメータを指定する。一番目のパラメータにはSQL文を書く。この時フォームから入力されうるものは%sとしておき、二番目のパラメータで%sに置き換える文字列群をタプルとして記述する。%sはシングルクウォートでくくる必要は無い。で、変数var1やvar2にシングルクウォートが含まれていても自動的にエスケープしてMariaDBに渡してくれるようだ。
(2015/8/2追記)
%sに与える値(上記例でのvar1やvar2)は文字列である必要はなく、intやfloat、あるいはdateやdatetime型でも大丈夫。いちいち型変換しなくて済むので便利。