2008年9月11日木曜日

batの威力

Windowsのコンソールでスクリプト走らせると、どうしてもスクリプト内で完結してしまいがち。
(pythonだとos.walkとかでフォルダの中を走査したり)

でも、bat使って連続してファイル読み込ませると、状況見ながらリファクタリングできることに気がついた。
なんかボトルネックになってるところを発見したときに、そこを直すと、次に実行されるときには治ったやつが実行されるので便利。

for %%A in (%1) do python hoge.py < %%A
とか覚えとくと便利。

for %%A in (%2) do %1 < %%A
は、うっかり変なコマンド走らせて吃驚したのでやらない方が良さそう。

2008年9月9日火曜日

PythonでSQLiteを使う(データを書き込む)

・データを書き込む

カーソルを作成したので、データベースにテーブルを作る準備ができました。テーブルの作成には、必要なステートメントを入れて、カーソルからexecuteメソッドを呼ばなければなりません。名前(name)とメアド(email)を保存するテーブルを作ってみましょう。ついでに、それぞれの列(row)に、ユニークな番号を振るようにもしてみましょう:

>>> cursor.execute('CREATE TABLE names (id INTEGER PRIMARY KEY, name VARCHAR(50), email VARCHAR(50))')

これでテーブルが出来ました。同様にして、データの追加もexecuteメソッドで行うことが出来ます:

>>> cursor.execute('INSERT INTO names VALUES (null, "john Doe", "jdoe@jdoe.zz")')
>>> cursor.execute('INSERT INTO names VALUES (null, "Mary Sue", "msue@msue.yy")')

カーソルから、最後に登録した列(row)番号を得ることも出来ます。たぶん必要でしょう:

>>> cursor.lastrowid
2

そうそう、「ユーザの入力に応じてデータベースに入れたい」と言うでしょ。明らかに、ユーザの入力はそのままでは危ないです。悪意あるユーザは、簡単にクエリーを操ってデータベースに通せるし、深刻なダメージをデータベースに与えることが出来ます。これは許容できません。でも、ありがたいことにpysqliteにはセキュリティを確保する手段があります。ある人の名前(name)とメアド(email)を、2つの変数で持っているとしましょう:

>>> name = "Luke Skywalker"
>>> email ="use@the.force"

このとき、(自分たちで定義したんだから)これらはまあ安全です。でも、いつもそうだとは言えないでしょう。安全なクエリーに変数を入れたい時は、単にその場所にクエスチョンマークを入れればいいだけです。すると、pysqliteが残りをやってくれます(paramstyleを参照のこと):

>>> cursor.execute('INSERT INTO names VALUES (null, ?, ?)', (name, email))

今、私たちは変更を加えたので、保存しなければなりません。(もしくは、データベースに変更を通知しなければなりません)これには、コネクションのcommitメソッドを呼び出します:

>>> connection.commit()

もしも、変更したにもかかわらずcommitを呼ばず、コネクションを閉じようとすると、pysqliteはエラーを返すでしょう。こういう行動は、トラブルのもとになります。でも、やってしまった変更を保存したくないときもあるでしょう。そんなときは、rollbackメソッドを使います。(色々保存せずに電源を切るというやり方もありますけど)例えば、もう一列テーブルに加えるとしましょう:

>>> cursor.execute('INSERT INTO names VALUES (null, "Bobby John", "bobby@john.qq")')

この変更を無かったことにしたい、としましょう。我々は単にrollbackメソッドを呼べば良いのです:

>>> connection.rollback()

ほら、これで変更は消えました。
次のステップでは検索をしてみましょう。