##
13.13.2 Connection Objects

A `Connection` instance has the following attributes and methods:

`isolation_level`
  Get or set the current isolation level. None for autocommit mode or one of "DEFERRED", "IMMEDIATE" or "EXLUSIVE". See ``Controlling Transactions'', section 13.13.5, for a more detailed explanation.

`cursor`( | [cursorClass])

  The cursor method accepts a single optional parameter cursorClass. If supplied, this must be a custom cursor class that extends `sqlite3.Cursor`.

`execute`( | sql, [parameters])

  This is a nonstandard shortcut that creates an intermediate cursor object by calling the cursor method, then calls the cursor's `execute` method with the parameters given.

`executemany`( | sql, [parameters])

  This is a nonstandard shortcut that creates an intermediate cursor object by calling the cursor method, then calls the cursor's `executemany` method with the parameters given.

`executescript`( | sql_script)

  This is a nonstandard shortcut that creates an intermediate cursor object by calling the cursor method, then calls the cursor's `executescript` method with the parameters given.

`create_function`( | name, num_params, func)

  Creates a user-defined function that you can later use from within SQL statements under the function name name. num_params is the number of parameters the function accepts, and func is a Python callable that is called as the SQL function.

  The function can return any of the types supported by SQLite: unicode, str, int, long, float, buffer and None.

  Example:

      import sqlite3
      import md5

      def md5sum(t):
          return md5.md5(t).hexdigest()

      con = sqlite3.connect(":memory:")
      con.create_function("md5", 1, md5sum)
      cur = con.cursor()
      cur.execute("select md5(?)", ("foo",))
      print cur.fetchone()[0]

`create_aggregate`( | name, num_params, aggregate_class)

  Creates a user-defined aggregate function.

  The aggregate class must implement a `step` method, which accepts the number of parameters num_params, and a `finalize` method which will return the final result of the aggregate.

  The `finalize` method can return any of the types supported by SQLite: unicode, str, int, long, float, buffer and None.

  Example:

      import sqlite3

      class MySum:
          def __init__(self):
              self.count = 0

          def step(self, value):
              self.count += value

          def finalize(self):
              return self.count

      con = sqlite3.connect(":memory:")
      con.create_aggregate("mysum", 1, MySum)
      cur = con.cursor()
      cur.execute("create table test(i)")
      cur.execute("insert into test(i) values (1)")
      cur.execute("insert into test(i) values (2)")
      cur.execute("select mysum(i) from test")
      print cur.fetchone()[0]

`create_collation`( | name, callable)

  Creates a collation with the specified name and callable. The callable will be passed two string arguments. It should return -1 if the first is ordered lower than the second, 0 if they are ordered equal and 1 if the first is ordered higher than the second. Note that this controls sorting (ORDER BY in SQL) so your comparisons don't affect other SQL operations.

  Note that the callable will get its parameters as Python bytestrings, which will normally be encoded in UTF-8.

  The following example shows a custom collation that sorts "the wrong way":

      import sqlite3

      def collate_reverse(string1, string2):
          return -cmp(string1, string2)

      con = sqlite3.connect(":memory:")
      con.create_collation("reverse", collate_reverse)

      cur = con.cursor()
      cur.execute("create table test(x)")
      cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
      cur.execute("select x from test order by x collate reverse")
      for row in cur:
          print row
      con.close()

  To remove a collation, call `create_collation` with None as callable:

          con.create_collation("reverse", None)

`interrupt`( | )

  You can call this method from a different thread to abort any queries that might be executing on the connection. The query will then abort and the caller will get an exception.

`set_authorizer`( | authorizer_callback)

  This routine registers a callback. The callback is invoked for each attempt to access a column of a table in the database. The callback should return `SQLITE_OK` if access is allowed, `SQLITE_DENY` if the entire SQL statement should be aborted with an error and `SQLITE_IGNORE` if the column should be treated as a NULL value. These constants are available in the `sqlite3` module.

  The first argument to the callback signifies what kind of operation is to be authorized. The second and third argument will be arguments or `None` depending on the first argument. The 4th argument is the name of the database ("main", "temp", etc.) if applicable. The 5th argument is the name of the inner-most trigger or view that is responsible for the access attempt or `None` if this access attempt is directly from input SQL code.

  Please consult the SQLite documentation about the possible values for the first argument and the meaning of the second and third argument depending on the first one. All necessary constants are available in the `sqlite3` module.

`row_factory`
  You can change this attribute to a callable that accepts the cursor and the original row as a tuple and will return the real result row. This way, you can implement more advanced ways of returning results, such as returning an object that can also access columns by name.

  Example:

      import sqlite3

      def dict_factory(cursor, row):
          d = {}
          for idx, col in enumerate(cursor.description):
              d[col[0]] = row[idx]
          return d

      con = sqlite3.connect(":memory:")
      con.row_factory = dict_factory
      cur = con.cursor()
      cur.execute("select 1 as a")
      print cur.fetchone()["a"]

  If returning a tuple doesn't suffice and you want name-based access to columns, you should consider setting `row_factory` to the highly-optimized `sqlite3.Row` type. `Row` provides both index-based and case-insensitive name-based access to columns with almost no memory overhead. It will probably be better than your own custom dictionary-based approach or even a db_row based solution.

`text_factory`
  Using this attribute you can control what objects are returned for the TEXT data type. By default, this attribute is set to `unicode` and the `sqlite3` module will return Unicode objects for TEXT. If you want to return bytestrings instead, you can set it to `str`.

  For efficiency reasons, there's also a way to return Unicode objects only for non-ASCII data, and bytestrings otherwise. To activate it, set this attribute to `sqlite3.OptimizedUnicode`.

  You can also set it to any other callable that accepts a single bytestring parameter and returns the resulting object.

  See the following example code for illustration:

      import sqlite3

      con = sqlite3.connect(":memory:")
      cur = con.cursor()

      # Create the table
      con.execute("create table person(lastname, firstname)")

      AUSTRIA = u"\xd6sterreich"

      # by default, rows are returned as Unicode
      cur.execute("select ?", (AUSTRIA,))
      row = cur.fetchone()
      assert row[0] == AUSTRIA

      # but we can make pysqlite always return bytestrings ...
      con.text_factory = str
      cur.execute("select ?", (AUSTRIA,))
      row = cur.fetchone()
      assert type(row[0]) == str
      # the bytestrings will be encoded in UTF-8, unless you stored garbage in the
      # database ...
      assert row[0] == AUSTRIA.encode("utf-8")

      # we can also implement a custom text_factory ...
      # here we implement one that will ignore Unicode characters that cannot be
      # decoded from UTF-8
      con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
      cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),))
      row = cur.fetchone()
      assert type(row[0]) == unicode

      # pysqlite offers a builtin optimized text_factory that will return bytestring
      # objects, if the data is in ASCII only, and otherwise return unicode objects
      con.text_factory = sqlite3.OptimizedUnicode
      cur.execute("select ?", (AUSTRIA,))
      row = cur.fetchone()
      assert type(row[0]) == unicode

      cur.execute("select ?", ("Germany",))
      row = cur.fetchone()
      assert type(row[0]) == str

`total_changes`
  Returns the total number of database rows that have been modified, inserted, or deleted since the database connection was opened.