・データを書き込む
カーソルを作成したので、データベースにテーブルを作る準備ができました。テーブルの作成には、必要なステートメントを入れて、カーソルから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()
ほら、これで変更は消えました。
次のステップでは検索をしてみましょう。