サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(4)-pymysql

手順としてはこんな感じ

準備

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型でも大丈夫。いちいち型変換しなくて済むので便利。

コメント(0)



Note

本サイトのハイパーリンクの一部は、オリジナルのサイトが閉鎖してしまったため"Internet archive Wayback Machine"へのリンクとなっています。そのようなリンクにはアイコン[archive]を付与しています。

本サイトはCookieを使用しています。本サイトにおけるCookieは以下の三種類のみであり、Cookieの内容に基づいてサイトの表示を変更する以外の用途には用いておりません。