##
3 カーソルオブジェクト

`Cursor` のインスタンスはには以下の属性とメソッドがあります:

`execute`( | sql, [parameters])

  SQL 文を実行します。SQL 文はパラメータ化できます(すなわち SQL リテラル の代わりの場所確保文字 (placeholder) を入れておけます)。 `sqlite3` モジュールは2種類の場所確保記法をサポートします。 一つは疑問符(qmark スタイル)、もう一つは名前(named スタイル)です。

  まず最初の例は qmark スタイルのパラメータを使った書き方を示します:

      import sqlite3

      con = sqlite3.connect("mydb")

      cur = con.cursor()

      who = "Yeltsin"
      age = 72

      cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
      print cur.fetchone()

  次の例は named スタイルの使い方です:

      import sqlite3

      con = sqlite3.connect("mydb")

      cur = con.cursor()

      who = "Yeltsin"
      age = 72

      cur.execute("select name_last, age from people where name_last=:who and age=:age",
          {"who": who, "age": age})
      print cur.fetchone()

  `execute()` は一つの SQL 文しか実行しません。二つ以上の文を実行 しようとすると、Warning を発生させます。複数の SQL 文を一つの呼び出し で実行したい場合は `executescript()` を使ってください。

`executemany`( | sql, seq_of_parameters)

  SQL 文 sql を seq_of_parameters の全てのパラメータシーケン スまたはマッピングに対して実行します。`sqlite3` モジュールでは、シーケンスの代わりにパラメータの組を 作り出すイテレータ使うことが許されています。

      import sqlite3

      class IterChars:
          def __init__(self):
              self.count = ord('a')

          def __iter__(self):
              return self

          def next(self):
              if self.count > ord('z'):
                  raise StopIteration
              self.count += 1
              return (chr(self.count - 1),) # this is a 1-tuple

      con = sqlite3.connect(":memory:")
      cur = con.cursor()
      cur.execute("create table characters(c)")

      theIter = IterChars()
      cur.executemany("insert into characters(c) values (?)", theIter)

      cur.execute("select c from characters")
      print cur.fetchall()

  もう少し短いジェネレータを使った例です:

      import sqlite3

      def char_generator():
          import string
          for c in string.letters[:26]:
              yield (c,)

      con = sqlite3.connect(":memory:")
      cur = con.cursor()
      cur.execute("create table characters(c)")

      cur.executemany("insert into characters(c) values (?)", char_generator())

      cur.execute("select c from characters")
      print cur.fetchall()

`executescript`( | sql_script)

  これは非標準の便宜メソッドで、一度に複数の SQL 文を実行することができ ます。メソッドは最初に COMMIT 文を発行し、次いで引数として渡された SQL スクリプトを実行します。

  sql_script はバイト文字列または Unicode 文字列です。

  例:

      import sqlite3

      con = sqlite3.connect(":memory:")
      cur = con.cursor()
      cur.executescript("""
          create table person(
              firstname,
              lastname,
              age
          );

          create table book(
              title,
              author,
              published
          );

          insert into book(title, author, published)
          values (
              'Dirk Gently''s Holistic Detective Agency',
              'Douglas Adams',
              1987
          );
          """)

`rowcount`
  一応 `sqlite3` モジュールの `Cursor` クラスはこの属性を実 装していますが、データベースエンジン自身の「影響を受けた行」/「選択さ れた行」の決定方法は少し風変わりです。

  `SELECT` 文では、全ての行を取得し終えるまで全部で何行になったか決 められないので `rowcount` はいつでも None です。

  `DELETE` 文では、条件を付けずに `DELETE FROM table` とすると SQLite は `rowcount` を 0 と報告します。

  `executemany` では、変更数が `rowcount` に合計されます。

  Python DB API 仕様で求められているように、`rowcount` 属性は 「現在のカーソルがまだ executeXXX() を実行していない場合や、 データベースインタフェースから最後に行った操作の結果行数を 決定できない場合には、この属性は -1 となります」。