Personal tools
You are here: Home KtJ's Blog サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(4)-pymysql
« January 2020 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
 

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

by ktj posted at 2014-06-29 10:42 last modified 2015-08-02 07:01

手順としてはこんな感じ

準備

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

The URL to Trackback this entry is:
http://www.ktjdragon.com/ktj/ktjs-blog/30b530a430c83092freebsd10-python3-3-bottle4f5c308a76f4305930e130e2-4-pymysql/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)


Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: