2001-03-29 12:00:15 -05:00
|
|
|
|
PEP: 249
|
|
|
|
|
Title: Python Database API Specification v2.0
|
|
|
|
|
Version: $Revision$
|
2006-03-23 15:13:19 -05:00
|
|
|
|
Last-Modified: $Date$
|
2007-06-28 16:11:32 -04:00
|
|
|
|
Author: mal@lemburg.com (Marc-André Lemburg)
|
|
|
|
|
Discussions-To: db-sig@python.org
|
2002-05-29 17:17:42 -04:00
|
|
|
|
Status: Final
|
2001-03-29 12:00:15 -05:00
|
|
|
|
Type: Informational
|
2007-06-19 00:20:07 -04:00
|
|
|
|
Created:
|
|
|
|
|
Post-History:
|
2001-03-30 11:56:15 -05:00
|
|
|
|
Replaces: 248
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
|
|
|
|
|
|
This API has been defined to encourage similarity between the
|
|
|
|
|
Python modules that are used to access databases. By doing this,
|
|
|
|
|
we hope to achieve a consistency leading to more easily understood
|
|
|
|
|
modules, code that is generally more portable across databases,
|
|
|
|
|
and a broader reach of database connectivity from Python.
|
|
|
|
|
|
|
|
|
|
The interface specification consists of several sections:
|
|
|
|
|
|
|
|
|
|
* Module Interface
|
|
|
|
|
* Connection Objects
|
|
|
|
|
* Cursor Objects
|
|
|
|
|
* Type Objects and Constructors
|
2006-03-28 10:47:14 -05:00
|
|
|
|
* Implementation Hints for Module Authors
|
|
|
|
|
* Optional DB API Extensions
|
|
|
|
|
* Optional Error Handling Extensions
|
2008-03-03 07:37:19 -05:00
|
|
|
|
* Optional Two-Phase Commit Extensions
|
2006-03-28 10:47:14 -05:00
|
|
|
|
* Frequently Asked Questions
|
|
|
|
|
* Major Changes from Version 1.0 to Version 2.0
|
|
|
|
|
* Open Issues
|
|
|
|
|
* Footnotes
|
2008-03-03 07:37:19 -05:00
|
|
|
|
* Acknowledgments
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Comments and questions about this specification may be directed
|
|
|
|
|
to the SIG for Database Interfacing with Python
|
|
|
|
|
(db-sig@python.org).
|
|
|
|
|
|
|
|
|
|
For more information on database interfacing with Python and
|
|
|
|
|
available packages see the Database Topic
|
|
|
|
|
Guide at http://www.python.org/topics/database/.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
This document describes the Python Database API Specification 2.0
|
|
|
|
|
and a set of common optional extensions. The previous version 1.0
|
|
|
|
|
version is still available as reference, in PEP 248. Package
|
|
|
|
|
writers are encouraged to use this version of the specification as
|
|
|
|
|
basis for new interfaces.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Module Interface
|
|
|
|
|
|
|
|
|
|
Access to the database is made available through connection
|
|
|
|
|
objects. The module must provide the following constructor for
|
|
|
|
|
these:
|
|
|
|
|
|
|
|
|
|
connect(parameters...)
|
|
|
|
|
|
|
|
|
|
Constructor for creating a connection to the database.
|
|
|
|
|
Returns a Connection Object. It takes a number of
|
|
|
|
|
parameters which are database dependent. [1]
|
|
|
|
|
|
|
|
|
|
These module globals must be defined:
|
|
|
|
|
|
|
|
|
|
apilevel
|
|
|
|
|
|
|
|
|
|
String constant stating the supported DB API level.
|
|
|
|
|
Currently only the strings '1.0' and '2.0' are allowed.
|
|
|
|
|
|
|
|
|
|
If not given, a DB-API 1.0 level interface should be
|
|
|
|
|
assumed.
|
|
|
|
|
|
|
|
|
|
threadsafety
|
|
|
|
|
|
|
|
|
|
Integer constant stating the level of thread safety the
|
|
|
|
|
interface supports. Possible values are:
|
|
|
|
|
|
|
|
|
|
0 Threads may not share the module.
|
|
|
|
|
1 Threads may share the module, but not connections.
|
|
|
|
|
2 Threads may share the module and connections.
|
|
|
|
|
3 Threads may share the module, connections and
|
|
|
|
|
cursors.
|
|
|
|
|
|
|
|
|
|
Sharing in the above context means that two threads may
|
|
|
|
|
use a resource without wrapping it using a mutex semaphore
|
|
|
|
|
to implement resource locking. Note that you cannot always
|
|
|
|
|
make external resources thread safe by managing access
|
|
|
|
|
using a mutex: the resource may rely on global variables
|
|
|
|
|
or other external sources that are beyond your control.
|
|
|
|
|
|
|
|
|
|
paramstyle
|
|
|
|
|
|
|
|
|
|
String constant stating the type of parameter marker
|
|
|
|
|
formatting expected by the interface. Possible values are
|
|
|
|
|
[2]:
|
|
|
|
|
|
|
|
|
|
'qmark' Question mark style,
|
|
|
|
|
e.g. '...WHERE name=?'
|
|
|
|
|
'numeric' Numeric, positional style,
|
|
|
|
|
e.g. '...WHERE name=:1'
|
|
|
|
|
'named' Named style,
|
|
|
|
|
e.g. '...WHERE name=:name'
|
|
|
|
|
'format' ANSI C printf format codes,
|
|
|
|
|
e.g. '...WHERE name=%s'
|
|
|
|
|
'pyformat' Python extended format codes,
|
|
|
|
|
e.g. '...WHERE name=%(name)s'
|
|
|
|
|
|
|
|
|
|
The module should make all error information available through
|
|
|
|
|
these exceptions or subclasses thereof:
|
|
|
|
|
|
|
|
|
|
Warning
|
|
|
|
|
|
|
|
|
|
Exception raised for important warnings like data
|
|
|
|
|
truncations while inserting, etc. It must be a subclass of
|
|
|
|
|
the Python StandardError (defined in the module
|
|
|
|
|
exceptions).
|
|
|
|
|
|
|
|
|
|
Error
|
|
|
|
|
|
|
|
|
|
Exception that is the base class of all other error
|
|
|
|
|
exceptions. You can use this to catch all errors with one
|
|
|
|
|
single 'except' statement. Warnings are not considered
|
|
|
|
|
errors and thus should not use this class as base. It must
|
|
|
|
|
be a subclass of the Python StandardError (defined in the
|
|
|
|
|
module exceptions).
|
|
|
|
|
|
|
|
|
|
InterfaceError
|
|
|
|
|
|
|
|
|
|
Exception raised for errors that are related to the
|
|
|
|
|
database interface rather than the database itself. It
|
|
|
|
|
must be a subclass of Error.
|
|
|
|
|
|
|
|
|
|
DatabaseError
|
|
|
|
|
|
|
|
|
|
Exception raised for errors that are related to the
|
|
|
|
|
database. It must be a subclass of Error.
|
|
|
|
|
|
|
|
|
|
DataError
|
|
|
|
|
|
|
|
|
|
Exception raised for errors that are due to problems with
|
|
|
|
|
the processed data like division by zero, numeric value
|
|
|
|
|
out of range, etc. It must be a subclass of DatabaseError.
|
|
|
|
|
|
|
|
|
|
OperationalError
|
|
|
|
|
|
|
|
|
|
Exception raised for errors that are related to the
|
|
|
|
|
database's operation and not necessarily under the control
|
|
|
|
|
of the programmer, e.g. an unexpected disconnect occurs,
|
|
|
|
|
the data source name is not found, a transaction could not
|
|
|
|
|
be processed, a memory allocation error occurred during
|
|
|
|
|
processing, etc. It must be a subclass of DatabaseError.
|
|
|
|
|
|
|
|
|
|
IntegrityError
|
|
|
|
|
|
|
|
|
|
Exception raised when the relational integrity of the
|
|
|
|
|
database is affected, e.g. a foreign key check fails. It
|
|
|
|
|
must be a subclass of DatabaseError.
|
|
|
|
|
|
|
|
|
|
InternalError
|
|
|
|
|
|
|
|
|
|
Exception raised when the database encounters an internal
|
|
|
|
|
error, e.g. the cursor is not valid anymore, the
|
|
|
|
|
transaction is out of sync, etc. It must be a subclass of
|
|
|
|
|
DatabaseError.
|
|
|
|
|
|
|
|
|
|
ProgrammingError
|
|
|
|
|
|
|
|
|
|
Exception raised for programming errors, e.g. table not
|
|
|
|
|
found or already exists, syntax error in the SQL
|
|
|
|
|
statement, wrong number of parameters specified, etc. It
|
|
|
|
|
must be a subclass of DatabaseError.
|
|
|
|
|
|
|
|
|
|
NotSupportedError
|
|
|
|
|
|
|
|
|
|
Exception raised in case a method or database API was used
|
|
|
|
|
which is not supported by the database, e.g. requesting a
|
|
|
|
|
.rollback() on a connection that does not support
|
|
|
|
|
transaction or has transactions turned off. It must be a
|
|
|
|
|
subclass of DatabaseError.
|
|
|
|
|
|
|
|
|
|
This is the exception inheritance layout:
|
|
|
|
|
|
|
|
|
|
StandardError
|
|
|
|
|
|__Warning
|
|
|
|
|
|__Error
|
|
|
|
|
|__InterfaceError
|
2002-11-13 16:20:45 -05:00
|
|
|
|
|__DatabaseError
|
|
|
|
|
|__DataError
|
|
|
|
|
|__OperationalError
|
|
|
|
|
|__IntegrityError
|
|
|
|
|
|__InternalError
|
|
|
|
|
|__ProgrammingError
|
|
|
|
|
|__NotSupportedError
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Note: The values of these exceptions are not defined. They should
|
|
|
|
|
give the user a fairly good idea of what went wrong, though.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Connection Objects
|
|
|
|
|
|
|
|
|
|
Connection Objects should respond to the following methods:
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.close()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Close the connection now (rather than whenever __del__ is
|
|
|
|
|
called). The connection will be unusable from this point
|
|
|
|
|
forward; an Error (or subclass) exception will be raised
|
|
|
|
|
if any operation is attempted with the connection. The
|
|
|
|
|
same applies to all cursor objects trying to use the
|
2001-04-27 07:20:14 -04:00
|
|
|
|
connection. Note that closing a connection without
|
|
|
|
|
committing the changes first will cause an implicit
|
|
|
|
|
rollback to be performed.
|
|
|
|
|
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.commit()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Commit any pending transaction to the database. Note that
|
|
|
|
|
if the database supports an auto-commit feature, this must
|
|
|
|
|
be initially off. An interface method may be provided to
|
|
|
|
|
turn it back on.
|
|
|
|
|
|
|
|
|
|
Database modules that do not support transactions should
|
|
|
|
|
implement this method with void functionality.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.rollback()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
This method is optional since not all databases provide
|
|
|
|
|
transaction support. [3]
|
|
|
|
|
|
|
|
|
|
In case a database does provide transactions this method
|
2007-04-27 18:51:38 -04:00
|
|
|
|
causes the database to roll back to the start of any
|
2001-03-29 12:00:15 -05:00
|
|
|
|
pending transaction. Closing a connection without
|
|
|
|
|
committing the changes first will cause an implicit
|
|
|
|
|
rollback to be performed.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.cursor()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Return a new Cursor Object using the connection. If the
|
|
|
|
|
database does not provide a direct cursor concept, the
|
|
|
|
|
module will have to emulate cursors using other means to
|
|
|
|
|
the extent needed by this specification. [4]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Cursor Objects
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
These objects represent a database cursor, which is used to manage
|
|
|
|
|
the context of a fetch operation. Cursors created from the same
|
|
|
|
|
connection are not isolated, i.e., any changes done to the
|
|
|
|
|
database by a cursor are immediately visible by the other
|
|
|
|
|
cursors. Cursors created from different connections can or can not
|
|
|
|
|
be isolated, depending on how the transaction support is
|
|
|
|
|
implemented (see also the connection's .rollback() and .commit()
|
|
|
|
|
methods).
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Cursor Objects should respond to the following methods and
|
|
|
|
|
attributes:
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.description
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
This read-only attribute is a sequence of 7-item
|
2008-03-03 07:37:19 -05:00
|
|
|
|
sequences.
|
|
|
|
|
|
|
|
|
|
Each of these sequences contains information describing
|
|
|
|
|
one result column:
|
|
|
|
|
|
|
|
|
|
(name,
|
|
|
|
|
type_code,
|
|
|
|
|
display_size,
|
|
|
|
|
internal_size,
|
|
|
|
|
precision,
|
|
|
|
|
scale,
|
|
|
|
|
null_ok)
|
|
|
|
|
|
|
|
|
|
The first two items (name and type_code) are mandatory,
|
|
|
|
|
the other five are optional and are set to None if no
|
|
|
|
|
meaningful values can be provided.
|
2001-04-27 07:20:14 -04:00
|
|
|
|
|
|
|
|
|
This attribute will be None for operations that
|
2001-03-29 12:00:15 -05:00
|
|
|
|
do not return rows or if the cursor has not had an
|
2008-03-03 07:37:19 -05:00
|
|
|
|
operation invoked via the .execute*() method yet.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
The type_code can be interpreted by comparing it to the
|
|
|
|
|
Type Objects specified in the section below.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.rowcount
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
This read-only attribute specifies the number of rows that
|
2008-03-03 07:37:19 -05:00
|
|
|
|
the last .execute*() produced (for DQL statements like
|
2001-03-29 12:00:15 -05:00
|
|
|
|
'select') or affected (for DML statements like 'update' or
|
|
|
|
|
'insert').
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
The attribute is -1 in case no .execute*() has been
|
2001-03-29 12:00:15 -05:00
|
|
|
|
performed on the cursor or the rowcount of the last
|
2008-03-03 07:37:19 -05:00
|
|
|
|
operation is cannot be determined by the interface. [7]
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
|
|
|
|
Note: Future versions of the DB API specification could
|
|
|
|
|
redefine the latter case to have the object return None
|
|
|
|
|
instead of -1.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.callproc(procname[,parameters])
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
(This method is optional since not all databases provide
|
|
|
|
|
stored procedures. [3])
|
|
|
|
|
|
|
|
|
|
Call a stored database procedure with the given name. The
|
|
|
|
|
sequence of parameters must contain one entry for each
|
|
|
|
|
argument that the procedure expects. The result of the
|
|
|
|
|
call is returned as modified copy of the input
|
|
|
|
|
sequence. Input parameters are left untouched, output and
|
|
|
|
|
input/output parameters replaced with possibly new values.
|
|
|
|
|
|
|
|
|
|
The procedure may also provide a result set as
|
|
|
|
|
output. This must then be made available through the
|
2008-03-03 07:37:19 -05:00
|
|
|
|
standard .fetch*() methods.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.close()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Close the cursor now (rather than whenever __del__ is
|
|
|
|
|
called). The cursor will be unusable from this point
|
|
|
|
|
forward; an Error (or subclass) exception will be raised
|
|
|
|
|
if any operation is attempted with the cursor.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.execute(operation[,parameters])
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Prepare and execute a database operation (query or
|
|
|
|
|
command). Parameters may be provided as sequence or
|
|
|
|
|
mapping and will be bound to variables in the operation.
|
|
|
|
|
Variables are specified in a database-specific notation
|
|
|
|
|
(see the module's paramstyle attribute for details). [5]
|
|
|
|
|
|
|
|
|
|
A reference to the operation will be retained by the
|
|
|
|
|
cursor. If the same operation object is passed in again,
|
|
|
|
|
then the cursor can optimize its behavior. This is most
|
|
|
|
|
effective for algorithms where the same operation is used,
|
|
|
|
|
but different parameters are bound to it (many times).
|
|
|
|
|
|
|
|
|
|
For maximum efficiency when reusing an operation, it is
|
2008-03-03 07:37:19 -05:00
|
|
|
|
best to use the .setinputsizes() method to specify the
|
2001-03-29 12:00:15 -05:00
|
|
|
|
parameter types and sizes ahead of time. It is legal for
|
|
|
|
|
a parameter to not match the predefined information; the
|
|
|
|
|
implementation should compensate, possibly with a loss of
|
|
|
|
|
efficiency.
|
|
|
|
|
|
|
|
|
|
The parameters may also be specified as list of tuples to
|
|
|
|
|
e.g. insert multiple rows in a single operation, but this
|
2008-03-03 07:37:19 -05:00
|
|
|
|
kind of usage is deprecated: .executemany() should be used
|
2001-03-29 12:00:15 -05:00
|
|
|
|
instead.
|
|
|
|
|
|
|
|
|
|
Return values are not defined.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.executemany(operation,seq_of_parameters)
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Prepare a database operation (query or command) and then
|
|
|
|
|
execute it against all parameter sequences or mappings
|
|
|
|
|
found in the sequence seq_of_parameters.
|
|
|
|
|
|
|
|
|
|
Modules are free to implement this method using multiple
|
2008-03-03 07:37:19 -05:00
|
|
|
|
calls to the .execute() method or by using array operations
|
2001-03-29 12:00:15 -05:00
|
|
|
|
to have the database process the sequence as a whole in
|
|
|
|
|
one call.
|
|
|
|
|
|
2001-08-08 04:38:06 -04:00
|
|
|
|
Use of this method for an operation which produces one or
|
|
|
|
|
more result sets constitutes undefined behavior, and the
|
|
|
|
|
implementation is permitted (but not required) to raise
|
|
|
|
|
an exception when it detects that a result set has been
|
|
|
|
|
created by an invocation of the operation.
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
The same comments as for .execute() also apply accordingly
|
2001-03-29 12:00:15 -05:00
|
|
|
|
to this method.
|
|
|
|
|
|
|
|
|
|
Return values are not defined.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.fetchone()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Fetch the next row of a query result set, returning a
|
|
|
|
|
single sequence, or None when no more data is
|
|
|
|
|
available. [6]
|
|
|
|
|
|
|
|
|
|
An Error (or subclass) exception is raised if the previous
|
2008-03-03 07:37:19 -05:00
|
|
|
|
call to .execute*() did not produce any result set or no
|
2001-03-29 12:00:15 -05:00
|
|
|
|
call was issued yet.
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
.fetchmany([size=cursor.arraysize])
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Fetch the next set of rows of a query result, returning a
|
|
|
|
|
sequence of sequences (e.g. a list of tuples). An empty
|
|
|
|
|
sequence is returned when no more rows are available.
|
|
|
|
|
|
|
|
|
|
The number of rows to fetch per call is specified by the
|
|
|
|
|
parameter. If it is not given, the cursor's arraysize
|
|
|
|
|
determines the number of rows to be fetched. The method
|
|
|
|
|
should try to fetch as many rows as indicated by the size
|
|
|
|
|
parameter. If this is not possible due to the specified
|
|
|
|
|
number of rows not being available, fewer rows may be
|
|
|
|
|
returned.
|
|
|
|
|
|
|
|
|
|
An Error (or subclass) exception is raised if the previous
|
2008-03-03 07:37:19 -05:00
|
|
|
|
call to .execute*() did not produce any result set or no
|
2001-03-29 12:00:15 -05:00
|
|
|
|
call was issued yet.
|
|
|
|
|
|
|
|
|
|
Note there are performance considerations involved with
|
|
|
|
|
the size parameter. For optimal performance, it is
|
|
|
|
|
usually best to use the arraysize attribute. If the size
|
|
|
|
|
parameter is used, then it is best for it to retain the
|
2008-03-03 07:37:19 -05:00
|
|
|
|
same value from one .fetchmany() call to the next.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.fetchall()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Fetch all (remaining) rows of a query result, returning
|
|
|
|
|
them as a sequence of sequences (e.g. a list of tuples).
|
|
|
|
|
Note that the cursor's arraysize attribute can affect the
|
|
|
|
|
performance of this operation.
|
|
|
|
|
|
|
|
|
|
An Error (or subclass) exception is raised if the previous
|
2008-03-03 07:37:19 -05:00
|
|
|
|
call to .execute*() did not produce any result set or no
|
2001-03-29 12:00:15 -05:00
|
|
|
|
call was issued yet.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.nextset()
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
(This method is optional since not all databases support
|
|
|
|
|
multiple result sets. [3])
|
|
|
|
|
|
|
|
|
|
This method will make the cursor skip to the next
|
|
|
|
|
available set, discarding any remaining rows from the
|
|
|
|
|
current set.
|
|
|
|
|
|
|
|
|
|
If there are no more sets, the method returns
|
|
|
|
|
None. Otherwise, it returns a true value and subsequent
|
|
|
|
|
calls to the fetch methods will return rows from the next
|
|
|
|
|
result set.
|
|
|
|
|
|
|
|
|
|
An Error (or subclass) exception is raised if the previous
|
2008-03-03 07:37:19 -05:00
|
|
|
|
call to .execute*() did not produce any result set or no
|
2001-03-29 12:00:15 -05:00
|
|
|
|
call was issued yet.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.arraysize
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
This read/write attribute specifies the number of rows to
|
2008-03-03 07:37:19 -05:00
|
|
|
|
fetch at a time with .fetchmany(). It defaults to 1
|
|
|
|
|
meaning to fetch a single row at a time.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Implementations must observe this value with respect to
|
2008-03-03 07:37:19 -05:00
|
|
|
|
the .fetchmany() method, but are free to interact with the
|
2001-03-29 12:00:15 -05:00
|
|
|
|
database a single row at a time. It may also be used in
|
2008-03-03 07:37:19 -05:00
|
|
|
|
the implementation of .executemany().
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.setinputsizes(sizes)
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
This can be used before a call to .execute*() to
|
2001-03-29 12:00:15 -05:00
|
|
|
|
predefine memory areas for the operation's parameters.
|
|
|
|
|
|
|
|
|
|
sizes is specified as a sequence -- one item for each
|
|
|
|
|
input parameter. The item should be a Type Object that
|
|
|
|
|
corresponds to the input that will be used, or it should
|
|
|
|
|
be an integer specifying the maximum length of a string
|
|
|
|
|
parameter. If the item is None, then no predefined memory
|
|
|
|
|
area will be reserved for that column (this is useful to
|
|
|
|
|
avoid predefined areas for large inputs).
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
This method would be used before the .execute*() method
|
2001-03-29 12:00:15 -05:00
|
|
|
|
is invoked.
|
|
|
|
|
|
|
|
|
|
Implementations are free to have this method do nothing
|
|
|
|
|
and users are free to not use it.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
.setoutputsize(size[,column])
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Set a column buffer size for fetches of large columns
|
|
|
|
|
(e.g. LONGs, BLOBs, etc.). The column is specified as an
|
|
|
|
|
index into the result sequence. Not specifying the column
|
|
|
|
|
will set the default size for all large columns in the
|
|
|
|
|
cursor.
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
This method would be used before the .execute*() method
|
2001-03-29 12:00:15 -05:00
|
|
|
|
is invoked.
|
|
|
|
|
|
|
|
|
|
Implementations are free to have this method do nothing
|
|
|
|
|
and users are free to not use it.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Type Objects and Constructors
|
|
|
|
|
|
|
|
|
|
Many databases need to have the input in a particular format for
|
|
|
|
|
binding to an operation's input parameters. For example, if an
|
|
|
|
|
input is destined for a DATE column, then it must be bound to the
|
|
|
|
|
database in a particular string format. Similar problems exist
|
|
|
|
|
for "Row ID" columns or large binary items (e.g. blobs or RAW
|
|
|
|
|
columns). This presents problems for Python since the parameters
|
2008-03-03 07:37:19 -05:00
|
|
|
|
to the .execute*() method are untyped. When the database module
|
2001-03-29 12:00:15 -05:00
|
|
|
|
sees a Python string object, it doesn't know if it should be bound
|
|
|
|
|
as a simple CHAR column, as a raw BINARY item, or as a DATE.
|
|
|
|
|
|
|
|
|
|
To overcome this problem, a module must provide the constructors
|
|
|
|
|
defined below to create objects that can hold special values.
|
|
|
|
|
When passed to the cursor methods, the module can then detect the
|
|
|
|
|
proper type of the input parameter and bind it accordingly.
|
|
|
|
|
|
|
|
|
|
A Cursor Object's description attribute returns information about
|
|
|
|
|
each of the result columns of a query. The type_code must compare
|
|
|
|
|
equal to one of Type Objects defined below. Type Objects may be
|
|
|
|
|
equal to more than one type code (e.g. DATETIME could be equal to
|
|
|
|
|
the type codes for date, time and timestamp columns; see the
|
|
|
|
|
Implementation Hints below for details).
|
|
|
|
|
|
|
|
|
|
The module exports the following constructors and singletons:
|
|
|
|
|
|
|
|
|
|
Date(year,month,day)
|
|
|
|
|
|
|
|
|
|
This function constructs an object holding a date value.
|
|
|
|
|
|
|
|
|
|
Time(hour,minute,second)
|
|
|
|
|
|
|
|
|
|
This function constructs an object holding a time value.
|
|
|
|
|
|
|
|
|
|
Timestamp(year,month,day,hour,minute,second)
|
|
|
|
|
|
|
|
|
|
This function constructs an object holding a time stamp
|
|
|
|
|
value.
|
|
|
|
|
|
|
|
|
|
DateFromTicks(ticks)
|
|
|
|
|
|
|
|
|
|
This function constructs an object holding a date value
|
|
|
|
|
from the given ticks value (number of seconds since the
|
|
|
|
|
epoch; see the documentation of the standard Python time
|
|
|
|
|
module for details).
|
|
|
|
|
|
|
|
|
|
TimeFromTicks(ticks)
|
|
|
|
|
|
|
|
|
|
This function constructs an object holding a time value
|
|
|
|
|
from the given ticks value (number of seconds since the
|
|
|
|
|
epoch; see the documentation of the standard Python time
|
|
|
|
|
module for details).
|
|
|
|
|
|
|
|
|
|
TimestampFromTicks(ticks)
|
|
|
|
|
|
|
|
|
|
This function constructs an object holding a time stamp
|
|
|
|
|
value from the given ticks value (number of seconds since
|
|
|
|
|
the epoch; see the documentation of the standard Python
|
|
|
|
|
time module for details).
|
|
|
|
|
|
|
|
|
|
Binary(string)
|
|
|
|
|
|
|
|
|
|
This function constructs an object capable of holding a
|
|
|
|
|
binary (long) string value.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STRING
|
|
|
|
|
|
|
|
|
|
This type object is used to describe columns in a database
|
|
|
|
|
that are string-based (e.g. CHAR).
|
|
|
|
|
|
|
|
|
|
BINARY
|
|
|
|
|
|
|
|
|
|
This type object is used to describe (long) binary columns
|
|
|
|
|
in a database (e.g. LONG, RAW, BLOBs).
|
|
|
|
|
|
|
|
|
|
NUMBER
|
|
|
|
|
|
|
|
|
|
This type object is used to describe numeric columns in a
|
|
|
|
|
database.
|
|
|
|
|
|
|
|
|
|
DATETIME
|
|
|
|
|
|
|
|
|
|
This type object is used to describe date/time columns in
|
|
|
|
|
a database.
|
|
|
|
|
|
|
|
|
|
ROWID
|
|
|
|
|
|
|
|
|
|
This type object is used to describe the "Row ID" column
|
|
|
|
|
in a database.
|
|
|
|
|
|
|
|
|
|
SQL NULL values are represented by the Python None singleton on
|
|
|
|
|
input and output.
|
|
|
|
|
|
|
|
|
|
Note: Usage of Unix ticks for database interfacing can cause
|
|
|
|
|
troubles because of the limited date range they cover.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
|
|
|
|
Implementation Hints for Module Authors
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
* Date/time objects can be implemented as Python datetime module
|
|
|
|
|
objects (available since Python 2.3, with a C API since 2.4) or
|
|
|
|
|
using the mxDateTime package (available for all Python versions
|
|
|
|
|
since 1.5.2). They both provide all necessary constructors and
|
|
|
|
|
methods at Python and C level.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
* Here is a sample implementation of the Unix ticks based
|
|
|
|
|
constructors for date/time delegating work to the generic
|
|
|
|
|
constructors:
|
|
|
|
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
def DateFromTicks(ticks):
|
2008-03-03 07:37:19 -05:00
|
|
|
|
return Date(*time.localtime(ticks)[:3])
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
def TimeFromTicks(ticks):
|
2008-03-03 07:37:19 -05:00
|
|
|
|
return Time(*time.localtime(ticks)[3:6])
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
def TimestampFromTicks(ticks):
|
2008-03-03 07:37:19 -05:00
|
|
|
|
return Timestamp(*time.localtime(ticks)[:6])
|
|
|
|
|
|
|
|
|
|
* The preferred object type for Binary objects are the
|
|
|
|
|
buffer types available in standard Python starting with
|
|
|
|
|
version 1.5.2. Please see the Python documentation for
|
|
|
|
|
details. For information about the C interface have a
|
|
|
|
|
look at Include/bufferobject.h and
|
|
|
|
|
Objects/bufferobject.c in the Python source
|
|
|
|
|
distribution.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
* This Python class allows implementing the above type
|
|
|
|
|
objects even though the description type code field yields
|
|
|
|
|
multiple values for on type object:
|
|
|
|
|
|
|
|
|
|
class DBAPITypeObject:
|
|
|
|
|
def __init__(self,*values):
|
|
|
|
|
self.values = values
|
|
|
|
|
def __cmp__(self,other):
|
|
|
|
|
if other in self.values:
|
|
|
|
|
return 0
|
|
|
|
|
if other < self.values:
|
|
|
|
|
return 1
|
|
|
|
|
else:
|
|
|
|
|
return -1
|
|
|
|
|
|
|
|
|
|
The resulting type object compares equal to all values
|
|
|
|
|
passed to the constructor.
|
|
|
|
|
|
|
|
|
|
* Here is a snippet of Python code that implements the exception
|
|
|
|
|
hierarchy defined above:
|
|
|
|
|
|
|
|
|
|
import exceptions
|
|
|
|
|
|
|
|
|
|
class Error(exceptions.StandardError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class Warning(exceptions.StandardError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class InterfaceError(Error):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class DatabaseError(Error):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class InternalError(DatabaseError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class OperationalError(DatabaseError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class ProgrammingError(DatabaseError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class IntegrityError(DatabaseError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class DataError(DatabaseError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class NotSupportedError(DatabaseError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
In C you can use the PyErr_NewException(fullname,
|
|
|
|
|
base, NULL) API to create the exception objects.
|
|
|
|
|
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
Optional DB API Extensions
|
|
|
|
|
|
|
|
|
|
During the lifetime of DB API 2.0, module authors have often
|
|
|
|
|
extended their implementations beyond what is required by this DB
|
|
|
|
|
API specification. To enhance compatibility and to provide a clean
|
|
|
|
|
upgrade path to possible future versions of the specification,
|
|
|
|
|
this section defines a set of common extensions to the core DB API
|
|
|
|
|
2.0 specification.
|
|
|
|
|
|
|
|
|
|
As with all DB API optional features, the database module authors
|
|
|
|
|
are free to not implement these additional attributes and methods
|
|
|
|
|
(using them will then result in an AttributeError) or to raise a
|
|
|
|
|
NotSupportedError in case the availability can only be checked at
|
|
|
|
|
run-time.
|
|
|
|
|
|
|
|
|
|
It has been proposed to make usage of these extensions optionally
|
|
|
|
|
visible to the programmer by issuing Python warnings through the
|
|
|
|
|
Python warning framework. To make this feature useful, the warning
|
2008-03-03 07:37:19 -05:00
|
|
|
|
messages must be standardized in order to be able to mask
|
|
|
|
|
them. These standard messages are referred to below as "Warning
|
|
|
|
|
Message".
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
|
|
|
|
Cursor Attribute .rownumber
|
|
|
|
|
|
|
|
|
|
This read-only attribute should provide the current 0-based
|
2008-03-03 07:37:19 -05:00
|
|
|
|
index of the cursor in the result set or None if the index
|
|
|
|
|
cannot be determined.
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
The index can be seen as index of the cursor in a sequence
|
|
|
|
|
(the result set). The next fetch operation will fetch the row
|
2002-02-04 17:47:07 -05:00
|
|
|
|
indexed by .rownumber in that sequence.
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension cursor.rownumber used"
|
|
|
|
|
|
|
|
|
|
Connection Attributes .Error, .ProgrammingError, etc.
|
|
|
|
|
|
|
|
|
|
All exception classes defined by the DB API standard should be
|
2006-03-28 10:47:14 -05:00
|
|
|
|
exposed on the Connection objects as attributes (in addition
|
2002-02-04 17:47:07 -05:00
|
|
|
|
to being available at module scope).
|
|
|
|
|
|
|
|
|
|
These attributes simplify error handling in multi-connection
|
|
|
|
|
environments.
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension connection.<exception> used"
|
|
|
|
|
|
|
|
|
|
Cursor Attributes .connection
|
|
|
|
|
|
|
|
|
|
This read-only attribute return a reference to the Connection
|
|
|
|
|
object on which the cursor was created.
|
|
|
|
|
|
|
|
|
|
The attribute simplifies writing polymorph code in
|
|
|
|
|
multi-connection environments.
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension cursor.connection used"
|
|
|
|
|
|
|
|
|
|
Cursor Method .scroll(value[,mode='relative'])
|
|
|
|
|
|
|
|
|
|
Scroll the cursor in the result set to a new position according
|
|
|
|
|
to mode.
|
|
|
|
|
|
|
|
|
|
If mode is 'relative' (default), value is taken as offset to
|
|
|
|
|
the current position in the result set, if set to 'absolute',
|
|
|
|
|
value states an absolute target position.
|
|
|
|
|
|
|
|
|
|
An IndexError should be raised in case a scroll operation would
|
|
|
|
|
leave the result set. In this case, the cursor position is left
|
|
|
|
|
undefined (ideal would be to not move the cursor at all).
|
|
|
|
|
|
|
|
|
|
Note: This method should use native scrollable cursors, if
|
|
|
|
|
available , or revert to an emulation for forward-only
|
|
|
|
|
scrollable cursors. The method may raise NotSupportedErrors to
|
|
|
|
|
signal that a specific operation is not supported by the
|
|
|
|
|
database (e.g. backward scrolling).
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension cursor.scroll() used"
|
|
|
|
|
|
|
|
|
|
Cursor Attribute .messages
|
|
|
|
|
|
|
|
|
|
This is a Python list object to which the interface appends
|
|
|
|
|
tuples (exception class, exception value) for all messages
|
|
|
|
|
which the interfaces receives from the underlying database for
|
|
|
|
|
this cursor.
|
|
|
|
|
|
|
|
|
|
The list is cleared by all standard cursor methods calls (prior
|
2008-03-03 07:37:19 -05:00
|
|
|
|
to executing the call) except for the .fetch*() calls
|
2002-02-04 17:47:07 -05:00
|
|
|
|
automatically to avoid excessive memory usage and can also be
|
|
|
|
|
cleared by executing "del cursor.messages[:]".
|
|
|
|
|
|
|
|
|
|
All error and warning messages generated by the database are
|
|
|
|
|
placed into this list, so checking the list allows the user to
|
|
|
|
|
verify correct operation of the method calls.
|
|
|
|
|
|
|
|
|
|
The aim of this attribute is to eliminate the need for a
|
|
|
|
|
Warning exception which often causes problems (some warnings
|
|
|
|
|
really only have informational character).
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension cursor.messages used"
|
|
|
|
|
|
|
|
|
|
Connection Attribute .messages
|
|
|
|
|
|
|
|
|
|
Same as cursor.messages except that the messages in the list
|
|
|
|
|
are connection oriented.
|
|
|
|
|
|
|
|
|
|
The list is cleared automatically by all standard connection
|
|
|
|
|
methods calls (prior to executing the call) to avoid excessive
|
|
|
|
|
memory usage and can also be cleared by executing "del
|
|
|
|
|
connection.messages[:]".
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension connection.messages used"
|
|
|
|
|
|
|
|
|
|
Cursor Method .next()
|
|
|
|
|
|
|
|
|
|
Return the next row from the currently executing SQL statement
|
|
|
|
|
using the same semantics as .fetchone(). A StopIteration
|
|
|
|
|
exception is raised when the result set is exhausted for Python
|
|
|
|
|
versions 2.2 and later. Previous versions don't have the
|
|
|
|
|
StopIteration exception and so the method should raise an
|
|
|
|
|
IndexError instead.
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension cursor.next() used"
|
|
|
|
|
|
|
|
|
|
Cursor Method .__iter__()
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
Return self to make cursors compatible to the iteration
|
|
|
|
|
protocol [8].
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension cursor.__iter__() used"
|
|
|
|
|
|
|
|
|
|
Cursor Attribute .lastrowid
|
|
|
|
|
|
|
|
|
|
This read-only attribute provides the rowid of the last
|
|
|
|
|
modified row (most databases return a rowid only when a single
|
|
|
|
|
INSERT operation is performed). If the operation does not set
|
|
|
|
|
a rowid or if the database does not support rowids, this
|
|
|
|
|
attribute should be set to None.
|
|
|
|
|
|
|
|
|
|
The semantics of .lastrowid are undefined in case the last
|
|
|
|
|
executed statement modified more than one row, e.g. when
|
|
|
|
|
using INSERT with .executemany().
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension cursor.lastrowid used"
|
|
|
|
|
|
|
|
|
|
|
2006-03-28 10:47:14 -05:00
|
|
|
|
Optional Error Handling Extensions
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
|
|
|
|
The core DB API specification only introduces a set of exceptions
|
|
|
|
|
which can be raised to report errors to the user. In some cases,
|
|
|
|
|
exceptions may be too disruptive for the flow of a program or even
|
|
|
|
|
render execution impossible.
|
|
|
|
|
|
|
|
|
|
For these cases and in order to simplify error handling when
|
|
|
|
|
dealing with databases, database module authors may choose to
|
|
|
|
|
implement user defineable error handlers. This section describes a
|
|
|
|
|
standard way of defining these error handlers.
|
|
|
|
|
|
|
|
|
|
Cursor/Connection Attribute .errorhandler
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
Read/write attribute which references an error handler to call
|
|
|
|
|
in case an error condition is met.
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
The handler must be a Python callable taking the following
|
|
|
|
|
arguments:
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
errorhandler(connection, cursor, errorclass, errorvalue)
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
where connection is a reference to the connection on which the
|
|
|
|
|
cursor operates, cursor a reference to the cursor (or None in
|
|
|
|
|
case the error does not apply to a cursor), errorclass is an
|
|
|
|
|
error class which to instantiate using errorvalue as
|
|
|
|
|
construction argument.
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
The standard error handler should add the error information to
|
|
|
|
|
the appropriate .messages attribute (connection.messages or
|
|
|
|
|
cursor.messages) and raise the exception defined by the given
|
|
|
|
|
errorclass and errorvalue parameters.
|
|
|
|
|
|
|
|
|
|
If no errorhandler is set (the attribute is None), the
|
|
|
|
|
standard error handling scheme as outlined above, should be
|
|
|
|
|
applied.
|
|
|
|
|
|
|
|
|
|
Warning Message: "DB-API extension .errorhandler used"
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
|
|
|
|
Cursors should inherit the .errorhandler setting from their
|
|
|
|
|
connection objects at cursor creation time.
|
|
|
|
|
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
Optional Two-Phase Commit Extensions
|
|
|
|
|
|
|
|
|
|
Many databases have support for two-phase commit (TPC) which
|
|
|
|
|
allows managing transactions across multiple database connections
|
|
|
|
|
and other resources.
|
|
|
|
|
|
|
|
|
|
If a database backend provides support for two-phase commit and
|
|
|
|
|
the database module author wishes to expose this support, the
|
|
|
|
|
following API should be implemented. NotSupportedError should be
|
|
|
|
|
raised, if the database backend support for two-phase commit
|
|
|
|
|
can only be checked at run-time.
|
|
|
|
|
|
|
|
|
|
TPC Transaction IDs
|
|
|
|
|
|
|
|
|
|
As many databases follow the XA specification, transaction IDs
|
|
|
|
|
are formed from three components:
|
|
|
|
|
|
|
|
|
|
* a format ID
|
|
|
|
|
* a global transaction ID
|
|
|
|
|
* a branch qualifier
|
|
|
|
|
|
|
|
|
|
For a particular global transaction, the first two components
|
|
|
|
|
should be the same for all resources. Each resource in the
|
|
|
|
|
global transaction should be assigned a different branch
|
|
|
|
|
qualifier.
|
|
|
|
|
|
|
|
|
|
The various components must satisfy the following criteria:
|
|
|
|
|
|
|
|
|
|
* format ID: a non-negative 32-bit integer.
|
|
|
|
|
|
|
|
|
|
* global transaction ID and branch qualifier: byte strings no
|
|
|
|
|
longer than 64 characters.
|
|
|
|
|
|
|
|
|
|
Transaction IDs are created with the .xid() connection method:
|
|
|
|
|
|
|
|
|
|
.xid(format_id, global_transaction_id, branch_qualifier)
|
|
|
|
|
|
|
|
|
|
Returns a transaction ID object suitable for passing to the
|
|
|
|
|
.tpc_*() methods of this connection.
|
|
|
|
|
|
|
|
|
|
If the database connection does not support TPC, a
|
|
|
|
|
NotSupportedError is raised.
|
|
|
|
|
|
|
|
|
|
The type of the object returned by .xid() is not defined, but
|
|
|
|
|
it must provide sequence behaviour, allowing access to the
|
|
|
|
|
three components. A conforming database module could choose
|
|
|
|
|
to represent transaction IDs with tuples rather than a custom
|
|
|
|
|
object.
|
|
|
|
|
|
|
|
|
|
TPC Connection Methods
|
|
|
|
|
|
|
|
|
|
.tpc_begin(xid)
|
|
|
|
|
|
|
|
|
|
Begins a TPC transaction with the given transaction ID xid.
|
|
|
|
|
|
|
|
|
|
This method should be called outside of a transaction
|
|
|
|
|
(i.e. nothing may have executed since the last .commit() or
|
|
|
|
|
.rollback()).
|
|
|
|
|
|
|
|
|
|
Furthermore, it is an error to call .commit() or .rollback()
|
|
|
|
|
within the TPC transaction. A ProgrammingError is raised, if
|
|
|
|
|
the application calls .commit() or .rollback() during an
|
|
|
|
|
active TPC transaction.
|
|
|
|
|
|
|
|
|
|
If the database connection does not support TPC, a
|
|
|
|
|
NotSupportedError is raised.
|
|
|
|
|
|
|
|
|
|
.tpc_prepare()
|
|
|
|
|
|
|
|
|
|
Performs the first phase of a transaction started with
|
|
|
|
|
.tpc_begin(). A ProgrammingError should be raised if this
|
|
|
|
|
method outside of a TPC transaction.
|
|
|
|
|
|
|
|
|
|
After calling .tpc_prepare(), no statements can be executed
|
|
|
|
|
until tpc_commit() or tpc_rollback() have been called.
|
|
|
|
|
|
|
|
|
|
.tpc_commit([xid])
|
|
|
|
|
|
|
|
|
|
When called with no arguments, .tpc_commit() commits a TPC
|
|
|
|
|
transaction previously prepared with .tpc_prepare().
|
|
|
|
|
|
|
|
|
|
If .tpc_commit() is called prior to .tpc_prepare(), a single
|
|
|
|
|
phase commit is performed. A transaction manager may choose
|
|
|
|
|
to do this if only a single resource is participating in the
|
|
|
|
|
global transaction.
|
|
|
|
|
|
|
|
|
|
When called with a transaction ID xid, the database commits
|
|
|
|
|
the given transaction. If an invalid transaction ID is
|
|
|
|
|
provided, a ProgrammingError will be raised. This form should
|
|
|
|
|
be called outside of a transaction, and is intended for use in
|
|
|
|
|
recovery.
|
|
|
|
|
|
|
|
|
|
On return, the TPC transaction is ended.
|
|
|
|
|
|
|
|
|
|
.tpc_rollback([xid])
|
|
|
|
|
|
|
|
|
|
When called with no arguments, .tpc_rollback() rolls back a
|
|
|
|
|
TPC transaction. It may be called before or after
|
|
|
|
|
.tpc_prepare().
|
|
|
|
|
|
|
|
|
|
When called with a transaction ID xid, it rolls back the given
|
|
|
|
|
transaction. If an invalid transaction ID is provided, a
|
|
|
|
|
ProgrammingError is raised. This form should be called
|
|
|
|
|
outside of a transaction, and is intended for use in recovery.
|
|
|
|
|
|
|
|
|
|
On return, the TPC transaction is ended.
|
|
|
|
|
|
|
|
|
|
.tpc_recover()
|
|
|
|
|
|
|
|
|
|
Returns a list of pending transaction IDs suitable for use
|
|
|
|
|
with .tpc_commit(xid) or .tpc_rollback(xid).
|
|
|
|
|
|
|
|
|
|
If the database does not support transaction recovery, it may
|
|
|
|
|
return an empty list or raise NotSupportedError.
|
|
|
|
|
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
Frequently Asked Questions
|
|
|
|
|
|
|
|
|
|
The database SIG often sees reoccurring questions about the DB API
|
|
|
|
|
specification. This section covers some of the issues people
|
|
|
|
|
sometimes have with the specification.
|
|
|
|
|
|
|
|
|
|
Question:
|
|
|
|
|
|
|
|
|
|
How can I construct a dictionary out of the tuples returned by
|
2008-03-03 07:37:19 -05:00
|
|
|
|
.fetch*():
|
2002-02-04 17:47:07 -05:00
|
|
|
|
|
|
|
|
|
Answer:
|
|
|
|
|
|
|
|
|
|
There are several existing tools available which provide
|
|
|
|
|
helpers for this task. Most of them use the approach of using
|
|
|
|
|
the column names defined in the cursor attribute .description
|
|
|
|
|
as basis for the keys in the row dictionary.
|
|
|
|
|
|
|
|
|
|
Note that the reason for not extending the DB API specification
|
2008-03-03 07:37:19 -05:00
|
|
|
|
to also support dictionary return values for the .fetch*()
|
2002-02-04 17:47:07 -05:00
|
|
|
|
methods is that this approach has several drawbacks:
|
|
|
|
|
|
|
|
|
|
* Some databases don't support case-sensitive column names or
|
|
|
|
|
auto-convert them to all lowercase or all uppercase
|
|
|
|
|
characters.
|
|
|
|
|
|
|
|
|
|
* Columns in the result set which are generated by the query
|
|
|
|
|
(e.g. using SQL functions) don't map to table column names
|
|
|
|
|
and databases usually generate names for these columns in a
|
|
|
|
|
very database specific way.
|
|
|
|
|
|
|
|
|
|
As a result, accessing the columns through dictionary keys
|
|
|
|
|
varies between databases and makes writing portable code
|
|
|
|
|
impossible.
|
|
|
|
|
|
|
|
|
|
|
2001-03-29 12:00:15 -05:00
|
|
|
|
Major Changes from Version 1.0 to Version 2.0
|
|
|
|
|
|
|
|
|
|
The Python Database API 2.0 introduces a few major changes
|
|
|
|
|
compared to the 1.0 version. Because some of these changes will
|
|
|
|
|
cause existing DB API 1.0 based scripts to break, the major
|
|
|
|
|
version number was adjusted to reflect this change.
|
|
|
|
|
|
|
|
|
|
These are the most important changes from 1.0 to 2.0:
|
|
|
|
|
|
|
|
|
|
* The need for a separate dbi module was dropped and the
|
|
|
|
|
functionality merged into the module interface itself.
|
|
|
|
|
|
|
|
|
|
* New constructors and Type Objects were added for date/time
|
|
|
|
|
values, the RAW Type Object was renamed to BINARY. The
|
|
|
|
|
resulting set should cover all basic data types commonly
|
|
|
|
|
found in modern SQL databases.
|
|
|
|
|
|
|
|
|
|
* New constants (apilevel, threadlevel, paramstyle) and
|
2008-03-03 07:37:19 -05:00
|
|
|
|
methods (.executemany(), .nextset()) were added to provide
|
|
|
|
|
better database bindings.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
* The semantics of .callproc() needed to call stored
|
|
|
|
|
procedures are now clearly defined.
|
|
|
|
|
|
|
|
|
|
* The definition of the .execute() return value changed.
|
|
|
|
|
Previously, the return value was based on the SQL statement
|
|
|
|
|
type (which was hard to implement right) -- it is undefined
|
|
|
|
|
now; use the more flexible .rowcount attribute
|
|
|
|
|
instead. Modules are free to return the old style return
|
|
|
|
|
values, but these are no longer mandated by the
|
|
|
|
|
specification and should be considered database interface
|
|
|
|
|
dependent.
|
|
|
|
|
|
|
|
|
|
* Class based exceptions were incorporated into the
|
|
|
|
|
specification. Module implementors are free to extend the
|
|
|
|
|
exception layout defined in this specification by
|
|
|
|
|
subclassing the defined exception classes.
|
|
|
|
|
|
2002-02-04 17:47:07 -05:00
|
|
|
|
Post-publishing additions to the DB API 2.0 specification:
|
|
|
|
|
|
|
|
|
|
* Additional optional DB API extensions to the set of
|
|
|
|
|
core functionality were specified.
|
|
|
|
|
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Open Issues
|
|
|
|
|
|
|
|
|
|
Although the version 2.0 specification clarifies a lot of
|
|
|
|
|
questions that were left open in the 1.0 version, there are still
|
2002-02-04 17:47:07 -05:00
|
|
|
|
some remaining issues which should be addressed in future
|
|
|
|
|
versions:
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
* Define a useful return value for .nextset() for the case where
|
|
|
|
|
a new result set is available.
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
* Integrate the decimal module Decimal object for use as
|
|
|
|
|
loss-less monetary and decimal interchange format.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Footnotes
|
|
|
|
|
|
|
|
|
|
[1] As a guideline the connection constructor parameters should be
|
|
|
|
|
implemented as keyword parameters for more intuitive use and
|
|
|
|
|
follow this order of parameters:
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
dsn Data source name as string
|
|
|
|
|
user User name as string (optional)
|
|
|
|
|
password Password as string (optional)
|
|
|
|
|
host Hostname (optional)
|
|
|
|
|
database Database name (optional)
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
E.g. a connect could look like this:
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
connect(dsn='myhost:MYDB',user='guido',password='234$')
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
[2] Module implementors should prefer 'numeric', 'named' or
|
|
|
|
|
'pyformat' over the other formats because these offer more
|
|
|
|
|
clarity and flexibility.
|
|
|
|
|
|
|
|
|
|
[3] If the database does not support the functionality required
|
|
|
|
|
by the method, the interface should throw an exception in
|
|
|
|
|
case the method is used.
|
|
|
|
|
|
|
|
|
|
The preferred approach is to not implement the method and
|
|
|
|
|
thus have Python generate an AttributeError in
|
|
|
|
|
case the method is requested. This allows the programmer to
|
|
|
|
|
check for database capabilities using the standard
|
|
|
|
|
hasattr() function.
|
|
|
|
|
|
|
|
|
|
For some dynamically configured interfaces it may not be
|
|
|
|
|
appropriate to require dynamically making the method
|
|
|
|
|
available. These interfaces should then raise a
|
|
|
|
|
NotSupportedError to indicate the non-ability
|
|
|
|
|
to perform the roll back when the method is invoked.
|
|
|
|
|
|
|
|
|
|
[4] a database interface may choose to support named cursors by
|
|
|
|
|
allowing a string argument to the method. This feature is
|
|
|
|
|
not part of the specification, since it complicates
|
2008-03-03 07:37:19 -05:00
|
|
|
|
semantics of the .fetch*() methods.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
[5] The module will use the __getitem__ method of the parameters
|
|
|
|
|
object to map either positions (integers) or names (strings)
|
|
|
|
|
to parameter values. This allows for both sequences and
|
|
|
|
|
mappings to be used as input.
|
|
|
|
|
|
|
|
|
|
The term "bound" refers to the process of binding an input
|
|
|
|
|
value to a database execution buffer. In practical terms,
|
|
|
|
|
this means that the input value is directly used as a value
|
|
|
|
|
in the operation. The client should not be required to
|
|
|
|
|
"escape" the value so that it can be used -- the value
|
|
|
|
|
should be equal to the actual database value.
|
|
|
|
|
|
|
|
|
|
[6] Note that the interface may implement row fetching using
|
|
|
|
|
arrays and other optimizations. It is not
|
|
|
|
|
guaranteed that a call to this method will only move the
|
|
|
|
|
associated cursor forward by one row.
|
|
|
|
|
|
|
|
|
|
[7] The rowcount attribute may be coded in a way that updates
|
|
|
|
|
its value dynamically. This can be useful for databases that
|
|
|
|
|
return usable rowcount values only after the first call to
|
2008-03-03 07:37:19 -05:00
|
|
|
|
a .fetch*() method.
|
|
|
|
|
|
|
|
|
|
[8] Implementation Note: Python C extensions will have to
|
|
|
|
|
implement the tp_iter slot on the cursor object instead of the
|
|
|
|
|
.__iter__() method.
|
2001-03-29 12:00:15 -05:00
|
|
|
|
|
|
|
|
|
Acknowledgements
|
|
|
|
|
|
|
|
|
|
Many thanks go to Andrew Kuchling who converted the Python
|
|
|
|
|
Database API Specification 2.0 from the original HTML format into
|
|
|
|
|
the PEP format.
|
|
|
|
|
|
2008-03-03 07:37:19 -05:00
|
|
|
|
Many thanks to James Henstridge for leading the discussion which
|
|
|
|
|
led to the standardization of the two-phase commit API extensions.
|
|
|
|
|
|
2001-03-29 12:00:15 -05:00
|
|
|
|
Copyright
|
|
|
|
|
|
|
|
|
|
This document has been placed in the Public Domain.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
End:
|