\section{\module{sqlite3} ---
         DB-API 2.0 interface for SQLite databases}

\declaremodule{builtin}{sqlite3}
\modulesynopsis{A DB-API 2.0 implementation using SQLite 3.x.}
\sectionauthor{Gerhard Häring}{gh@ghaering.de}
\versionadded{2.5}

SQLite is a C library that provides a lightweight disk-based database
that doesn't require a separate server process and allows accessing
the database using a nonstandard variant of the SQL query language.
Some applications can use SQLite for internal data storage.  It's also
possible to prototype an application using SQLite and then port the
code to a larger database such as PostgreSQL or Oracle.
 
pysqlite was written by Gerhard H\"aring and provides a SQL interface
compliant with the DB-API 2.0 specification described by
\pep{249}. 

To use the module, you must first create a \class{Connection} object
that represents the database.  Here the data will be stored in the 
\file{/tmp/example} file:

\begin{verbatim}
conn = sqlite3.connect('/tmp/example')
\end{verbatim}

You can also supply the special name \samp{:memory:} to create
a database in RAM.

Once you have a \class{Connection}, you can create a \class{Cursor} 
object and call its \method{execute()} method to perform SQL commands:

\begin{verbatim}
c = conn.cursor()

# Create table
c.execute('''create table stocks
(date text, trans text, symbol text,
 qty real, price real)''')

# Insert a row of data
c.execute("""insert into stocks
          values ('2006-01-05','BUY','RHAT',100,35.14)""")

# Save (commit) the changes
conn.commit()

# We can also close the cursor if we are done with it
c.close()
\end{verbatim}    

Usually your SQL operations will need to use values from Python
variables.  You shouldn't assemble your query using Python's string
operations because doing so is insecure; it makes your program
vulnerable to an SQL injection attack.  

Instead, use the DB-API's parameter substitution.  Put \samp{?} as a
placeholder wherever you want to use a value, and then provide a tuple
of values as the second argument to the cursor's \method{execute()}
method.  (Other database modules may use a different placeholder,
such as \samp{\%s} or \samp{:1}.) For example:

\begin{verbatim}    
# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in (('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ):
    c.execute('insert into stocks values (?,?,?,?,?)', t)
\end{verbatim}

To retrieve data after executing a SELECT statement, you can either 
treat the cursor as an iterator, call the cursor's \method{fetchone()}
method to retrieve a single matching row, 
or call \method{fetchall()} to get a list of the matching rows.

This example uses the iterator form:

\begin{verbatim}
>>> c = conn.cursor()
>>> c.execute('select * from stocks order by price')
>>> for row in c:
...    print row
...
(u'2006-01-05', u'BUY', u'RHAT', 100, 35.140000000000001)
(u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
(u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
(u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0)
>>>
\end{verbatim}

\begin{seealso}

\seeurl{http://www.pysqlite.org}
{The pysqlite web page.}

\seeurl{http://www.sqlite.org}
{The SQLite web page; the documentation describes the syntax and the
available data types for the supported SQL dialect.}

\seepep{249}{Database API Specification 2.0}{PEP written by
Marc-Andr\'e Lemburg.}

\end{seealso}


\subsection{Module functions and constants\label{sqlite3-Module-Contents}}

\begin{datadesc}{PARSE_DECLTYPES}
This constant is meant to be used with the \var{detect_types} parameter of the
\function{connect} function.

Setting it makes the \module{sqlite3} module parse the declared type for each column it
returns.  It will parse out the first word of the declared type, i. e. for
"integer primary key", it will parse out "integer". Then for that column, it
will look into the converters dictionary and use the converter function
registered for that type there.  Converter names are case-sensitive!
\end{datadesc}


\begin{datadesc}{PARSE_COLNAMES}
This constant is meant to be used with the \var{detect_types} parameter of the
\function{connect} function.

Setting this makes the SQLite interface parse the column name for each column
it returns.  It will look for a string formed [mytype] in there, and then
decide that 'mytype' is the type of the column. It will try to find an entry of
'mytype' in the converters dictionary and then use the converter function found
there to return the value. The column name found in \member{cursor.description} is only
the first word of the column name, i.  e. if you use something like
\code{'as "x [datetime]"'} in your SQL, then we will parse out everything until the
first blank for the column name: the column name would simply be "x".
\end{datadesc}

\begin{funcdesc}{connect}{database\optional{, timeout, isolation_level, detect_types, factory}}
Opens a connection to the SQLite database file \var{database}. You can use
\code{":memory:"} to open a database connection to a database that resides in
RAM instead of on disk.

When a database is accessed by multiple connections, and one of the processes
modifies the database, the SQLite database is locked until that transaction is
committed. The \var{timeout} parameter specifies how long the connection should
wait for the lock to go away until raising an exception. The default for the
timeout parameter is 5.0 (five seconds). 

For the \var{isolation_level} parameter, please see the \member{isolation_level}
property of \class{Connection} objects in section~\ref{sqlite3-Connection-IsolationLevel}.

SQLite natively supports only the types TEXT, INTEGER, FLOAT, BLOB and NULL. If
you want to use other types, like you have to add support for them yourself.
The \var{detect_types} parameter and the using custom \strong{converters} registered with
the module-level \function{register_converter} function allow you to easily do that.

\var{detect_types} defaults to 0 (i. e. off, no type detection), you can set it
to any combination of \constant{PARSE_DECLTYPES} and \constant{PARSE_COLNAMES} to turn type
detection on.

By default, the \module{sqlite3} module uses its \class{Connection} class for the
connect call.  You can, however, subclass the \class{Connection} class and make
\function{connect} use your class instead by providing your class for the
\var{factory} parameter.

Consult the section \ref{sqlite3-Types} of this manual for details.

The \module{sqlite3} module internally uses a statement cache to avoid SQL parsing
overhead. If you want to explicitly set the number of statements that are
cached for the connection, you can set the \var{cached_statements} parameter.
The currently implemented default is to cache 100 statements.
\end{funcdesc}

\begin{funcdesc}{register_converter}{typename, callable}
Registers a callable to convert a bytestring from the database into a custom
Python type. The callable will be invoked for all database values that are of
the type \var{typename}. Confer the parameter \var{detect_types} of the
\function{connect} function for how the type detection works. Note that the case of
\var{typename} and the name of the type in your query must match!
\end{funcdesc}

\begin{funcdesc}{register_adapter}{type, callable}
Registers a callable to convert the custom Python type \var{type} into one of
SQLite's supported types. The callable \var{callable} accepts as single
parameter the Python value, and must return a value of the following types:
int, long, float, str (UTF-8 encoded), unicode or buffer.
\end{funcdesc}

\begin{funcdesc}{complete_statement}{sql}
Returns \constant{True} if the string \var{sql} contains one or more complete SQL
statements terminated by semicolons. It does not verify that the SQL is
syntactically correct, only that there are no unclosed string literals and the
statement is terminated by a semicolon.

This can be used to build a shell for SQLite, as in the following example:

    \verbatiminput{sqlite3/complete_statement.py}
\end{funcdesc}

\begin{funcdesc}{enable_callback_tracebacks}{flag}
By default you will not get any tracebacks in user-defined functions,
aggregates, converters, authorizer callbacks etc. If you want to debug them,
you can call this function with \var{flag} as True. Afterwards, you will get
tracebacks from callbacks on \code{sys.stderr}. Use \constant{False} to disable
the feature again.
\end{funcdesc}

\subsection{Connection Objects \label{sqlite3-Connection-Objects}}

A \class{Connection} instance has the following attributes and methods:

\label{sqlite3-Connection-IsolationLevel}
\begin{memberdesc}{isolation_level}
  Get or set the current isolation level. None for autocommit mode or one of
  "DEFERRED", "IMMEDIATE" or "EXLUSIVE". See ``Controlling Transactions'', 
  section~\ref{sqlite3-Controlling-Transactions}, for a more detailed explanation.
\end{memberdesc}

\begin{methoddesc}{cursor}{\optional{cursorClass}}
  The cursor method accepts a single optional parameter \var{cursorClass}.
  If supplied, this must be a custom cursor class that extends 
  \class{sqlite3.Cursor}.
\end{methoddesc}

\begin{methoddesc}{execute}{sql, \optional{parameters}}
This is a nonstandard shortcut that creates an intermediate cursor object by
calling the cursor method, then calls the cursor's \method{execute} method with the
parameters given.
\end{methoddesc}

\begin{methoddesc}{executemany}{sql, \optional{parameters}}
This is a nonstandard shortcut that creates an intermediate cursor object by
calling the cursor method, then calls the cursor's \method{executemany} method with the
parameters given.
\end{methoddesc}

\begin{methoddesc}{executescript}{sql_script}
This is a nonstandard shortcut that creates an intermediate cursor object by
calling the cursor method, then calls the cursor's \method{executescript} method with the
parameters given.
\end{methoddesc}

\begin{methoddesc}{create_function}{name, num_params, func}

Creates a user-defined function that you can later use from within SQL
statements under the function name \var{name}. \var{num_params} is the number
of parameters the function accepts, and \var{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:

  \verbatiminput{sqlite3/md5func.py}
\end{methoddesc}

\begin{methoddesc}{create_aggregate}{name, num_params, aggregate_class}

Creates a user-defined aggregate function.

The aggregate class must implement a \code{step} method, which accepts the
number of parameters \var{num_params}, and a \code{finalize} method which
will return the final result of the aggregate.

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

Example:

  \verbatiminput{sqlite3/mysumaggr.py}
\end{methoddesc}

\begin{methoddesc}{create_collation}{name, callable}

Creates a collation with the specified \var{name} and \var{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":

  \verbatiminput{sqlite3/collation_reverse.py}

To remove a collation, call \code{create_collation} with None as callable:

\begin{verbatim}
    con.create_collation("reverse", None)
\end{verbatim}
\end{methoddesc}

\begin{methoddesc}{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.
\end{methoddesc}

\begin{methoddesc}{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
\constant{SQLITE_OK} if access is allowed, \constant{SQLITE_DENY} if the entire
SQL statement should be aborted with an error and \constant{SQLITE_IGNORE} if
the column should be treated as a NULL value. These constants are available in
the \module{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 \constant{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
\constant{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 \module{sqlite3}
module.
\end{methoddesc}

\begin{memberdesc}{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:

  \verbatiminput{sqlite3/row_factory.py}

  If returning a tuple doesn't suffice and you want name-based
  access to columns, you should consider setting \member{row_factory} to the
  highly-optimized \class{sqlite3.Row} type. \class{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.
  % XXX what's a db_row-based solution?
\end{memberdesc}

\begin{memberdesc}{text_factory}
  Using this attribute you can control what objects are returned for the
  TEXT data type. By default, this attribute is set to \class{unicode} and
  the \module{sqlite3} module will return Unicode objects for TEXT. If you want to return
  bytestrings instead, you can set it to \class{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 \constant{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:

  \verbatiminput{sqlite3/text_factory.py}
\end{memberdesc}

\begin{memberdesc}{total_changes}
  Returns the total number of database rows that have been modified, inserted,
  or deleted since the database connection was opened.
\end{memberdesc}





\subsection{Cursor Objects \label{sqlite3-Cursor-Objects}}

A \class{Cursor} instance has the following attributes and methods:

\begin{methoddesc}{execute}{sql, \optional{parameters}}

Executes a SQL statement. The SQL statement may be parametrized (i. e.
placeholders instead of SQL literals). The \module{sqlite3} module supports two kinds of
placeholders: question marks (qmark style) and named placeholders (named
style).

This example shows how to use parameters with qmark style:

    \verbatiminput{sqlite3/execute_1.py}

This example shows how to use the named style:

    \verbatiminput{sqlite3/execute_2.py}

    \method{execute()} will only execute a single SQL statement. If you try to
    execute more than one statement with it, it will raise a Warning. Use
    \method{executescript()} if you want to execute multiple SQL statements with one
    call.
\end{methoddesc}


\begin{methoddesc}{executemany}{sql, seq_of_parameters}
Executes a SQL command against all parameter sequences or mappings found in the
sequence \var{sql}. The \module{sqlite3} module also allows
using an iterator yielding parameters instead of a sequence.

\verbatiminput{sqlite3/executemany_1.py}

Here's a shorter example using a generator:

\verbatiminput{sqlite3/executemany_2.py}
\end{methoddesc}

\begin{methoddesc}{executescript}{sql_script}

This is a nonstandard convenience method for executing multiple SQL statements
at once. It issues a COMMIT statement first, then executes the SQL script it
gets as a parameter.

\var{sql_script} can be a bytestring or a Unicode string.

Example:

\verbatiminput{sqlite3/executescript.py}
\end{methoddesc}

\begin{memberdesc}{rowcount}
  Although the \class{Cursor} class of the \module{sqlite3} module implements this
  attribute, the database engine's own support for the determination of "rows
  affected"/"rows selected" is quirky.

  For \code{SELECT} statements, \member{rowcount} is always None because we cannot
  determine the number of rows a query produced until all rows were fetched.

  For \code{DELETE} statements, SQLite reports \member{rowcount} as 0 if you make a
  \code{DELETE FROM table} without any condition.

  For \method{executemany} statements, the number of modifications are summed
  up into \member{rowcount}.

  As required by the Python DB API Spec, the \member{rowcount} attribute "is -1
  in case no executeXX() has been performed on the cursor or the rowcount
  of the last operation is not determinable by the interface".
\end{memberdesc}

\subsection{SQLite and Python types\label{sqlite3-Types}}

\subsubsection{Introduction}

SQLite natively supports the following types: NULL, INTEGER, REAL, TEXT, BLOB.

The following Python types can thus be sent to SQLite without any problem:

\begin{tableii}  {c|l}{code}{Python type}{SQLite type}
\lineii{None}{NULL}
\lineii{int}{INTEGER}
\lineii{long}{INTEGER}
\lineii{float}{REAL}
\lineii{str (UTF8-encoded)}{TEXT}
\lineii{unicode}{TEXT}
\lineii{buffer}{BLOB}
\end{tableii}

This is how SQLite types are converted to Python types by default:

\begin{tableii}  {c|l}{code}{SQLite type}{Python type}
\lineii{NULL}{None}
\lineii{INTEGER}{int or long, depending on size}
\lineii{REAL}{float}
\lineii{TEXT}{depends on text_factory, unicode by default}
\lineii{BLOB}{buffer}
\end{tableii}

The type system of the \module{sqlite3} module is extensible in two ways: you can store
additional Python types in a SQLite database via object adaptation, and you can
let the \module{sqlite3} module convert SQLite types to different Python types via
converters.

\subsubsection{Using adapters to store additional Python types in SQLite databases}

As described before, SQLite supports only a limited set of types natively. To
use other Python types with SQLite, you must \strong{adapt} them to one of the sqlite3
module's supported types for SQLite: one of NoneType, int, long, float,
str, unicode, buffer.

The \module{sqlite3} module uses Python object adaptation, as described in \pep{246} for this.  The protocol to use is \class{PrepareProtocol}.

There are two ways to enable the \module{sqlite3} module to adapt a custom Python type
to one of the supported ones.

\paragraph{Letting your object adapt itself}

This is a good approach if you write the class yourself. Let's suppose you have
a class like this:

\begin{verbatim}
class Point(object):
    def __init__(self, x, y):
        self.x, self.y = x, y
\end{verbatim}

Now you want to store the point in a single SQLite column.  First you'll have to
choose one of the supported types first to be used for representing the point.
Let's just use str and separate the coordinates using a semicolon. Then you
need to give your class a method \code{__conform__(self, protocol)} which must
return the converted value. The parameter \var{protocol} will be
\class{PrepareProtocol}.

\verbatiminput{sqlite3/adapter_point_1.py}

\paragraph{Registering an adapter callable}

The other possibility is to create a function that converts the type to the
string representation and register the function with \method{register_adapter}.

\begin{notice}
The type/class to adapt must be a new-style class, i. e. it must have
\class{object} as one of its bases.
\end{notice}

    \verbatiminput{sqlite3/adapter_point_2.py}

The \module{sqlite3} module has two default adapters for Python's built-in
\class{datetime.date} and \class{datetime.datetime} types.  Now let's suppose
we want to store \class{datetime.datetime} objects not in ISO representation,
but as a \UNIX{} timestamp.

    \verbatiminput{sqlite3/adapter_datetime.py}

\subsubsection{Converting SQLite values to custom Python types}

Writing an adapter lets you send custom Python types to SQLite.
But to make it really useful we need to make the Python to SQLite to Python
roundtrip work.  

Enter converters.

Let's go back to the \class{Point} class. We stored the x and y
coordinates separated via semicolons as strings in SQLite.

First, we'll define a converter function that accepts the string as a
parameter and constructs a \class{Point} object from it.

\begin{notice}
Converter functions \strong{always} get called with a string, no matter
under which data type you sent the value to SQLite.
\end{notice}

\begin{notice}
Converter names are looked up in a case-sensitive manner.
\end{notice}


\begin{verbatim}
    def convert_point(s):
        x, y = map(float, s.split(";"))
        return Point(x, y)
\end{verbatim}

Now you need to make the \module{sqlite3} module know that what you select from the
database is actually a point. There are two ways of doing this:

\begin{itemize}
 \item Implicitly via the declared type
 \item Explicitly via the column name
\end{itemize}

Both ways are described in ``Module Constants'', section~\ref{sqlite3-Module-Contents}, in
the entries for the constants \constant{PARSE_DECLTYPES} and
\constant{PARSE_COLNAMES}.


The following example illustrates both approaches.

    \verbatiminput{sqlite3/converter_point.py}

\subsubsection{Default adapters and converters}

There are default adapters for the date and datetime types in the datetime
module. They will be sent as ISO dates/ISO timestamps to SQLite.

The default converters are registered under the name "date" for \class{datetime.date}
and under the name "timestamp" for \class{datetime.datetime}.

This way, you can use date/timestamps from Python without any additional
fiddling in most cases. The format of the adapters is also compatible with the
experimental SQLite date/time functions.

The following example demonstrates this.

    \verbatiminput{sqlite3/pysqlite_datetime.py}

\subsection{Controlling Transactions \label{sqlite3-Controlling-Transactions}}

By default, the \module{sqlite3} module opens transactions implicitly before a Data Modification Language (DML) 
statement (i.e. INSERT/UPDATE/DELETE/REPLACE), and commits transactions implicitly
before a non-DML, non-query statement (i. e. anything other than
SELECT/INSERT/UPDATE/DELETE/REPLACE).

So if you are within a transaction and issue a command like \code{CREATE TABLE
...}, \code{VACUUM}, \code{PRAGMA}, the \module{sqlite3} module will commit implicitly
before executing that command. There are two reasons for doing that. The first
is that some of these commands don't work within transactions. The other reason
is that pysqlite needs to keep track of the transaction state (if a transaction
is active or not).

You can control which kind of "BEGIN" statements pysqlite implicitly executes
(or none at all) via the \var{isolation_level} parameter to the
\function{connect} call, or via the \member{isolation_level} property of
connections.

If you want \strong{autocommit mode}, then set \member{isolation_level} to None.

Otherwise leave it at its default, which will result in a plain "BEGIN"
statement, or set it to one of SQLite's supported isolation levels: DEFERRED,
IMMEDIATE or EXCLUSIVE.

As the \module{sqlite3} module needs to keep track of the transaction state, you should
not use \code{OR ROLLBACK} or \code{ON CONFLICT ROLLBACK} in your SQL. Instead,
catch the \exception{IntegrityError} and call the \method{rollback} method of
the connection yourself.

\subsection{Using pysqlite efficiently}

\subsubsection{Using shortcut methods}

Using the nonstandard \method{execute}, \method{executemany} and
\method{executescript} methods of the \class{Connection} object, your code can
be written more concisely because you don't have to create the (often
superfluous) \class{Cursor} objects explicitly. Instead, the \class{Cursor}
objects are created implicitly and these shortcut methods return the cursor
objects. This way, you can execute a SELECT statement and iterate
over it directly using only a single call on the \class{Connection} object.

    \verbatiminput{sqlite3/shortcut_methods.py}

\subsubsection{Accessing columns by name instead of by index}

One useful feature of the \module{sqlite3} module is the builtin \class{sqlite3.Row} class
designed to be used as a row factory.

Rows wrapped with this class can be accessed both by index (like tuples) and
case-insensitively by name:

    \verbatiminput{sqlite3/rowclass.py}


