[976] | 1 |
|
---|
| 2 | Python Database API Specification v2.0
|
---|
| 3 |
|
---|
| 4 | ---------------------------------------------------------------------------
|
---|
| 5 | http://www.python.org/peps/pep-0249.html
|
---|
| 6 | ---------------------------------------------------------------------------
|
---|
| 7 |
|
---|
| 8 | Introduction
|
---|
| 9 |
|
---|
| 10 | This API has been defined to encourage similarity between the
|
---|
| 11 | Python modules that are used to access databases. By doing this,
|
---|
| 12 | we hope to achieve a consistency leading to more easily understood
|
---|
| 13 | modules, code that is generally more portable across databases,
|
---|
| 14 | and a broader reach of database connectivity from Python.
|
---|
| 15 |
|
---|
| 16 | The interface specification consists of several sections:
|
---|
| 17 |
|
---|
| 18 | * Module Interface
|
---|
| 19 | * Connection Objects
|
---|
| 20 | * Cursor Objects
|
---|
| 21 | * DBI Helper Objects
|
---|
| 22 | * Type Objects and Constructors
|
---|
| 23 | * Implementation Hints
|
---|
| 24 | * Major Changes from 1.0 to 2.0
|
---|
| 25 |
|
---|
| 26 | Comments and questions about this specification may be directed
|
---|
| 27 | to the SIG for Database Interfacing with Python
|
---|
| 28 | (db-sig@python.org).
|
---|
| 29 |
|
---|
| 30 | For more information on database interfacing with Python and
|
---|
| 31 | available packages see the Database Topic
|
---|
| 32 | Guide at http://www.python.org/topics/database/.
|
---|
| 33 |
|
---|
| 34 | This document describes the Python Database API Specification 2.0
|
---|
| 35 | and a set of common optional extensions. The previous version 1.0
|
---|
| 36 | version is still available as reference, in PEP 248. Package
|
---|
| 37 | writers are encouraged to use this version of the specification as
|
---|
| 38 | basis for new interfaces.
|
---|
| 39 |
|
---|
| 40 |
|
---|
| 41 | Module Interface
|
---|
| 42 |
|
---|
| 43 | Access to the database is made available through connection
|
---|
| 44 | objects. The module must provide the following constructor for
|
---|
| 45 | these:
|
---|
| 46 |
|
---|
| 47 | connect(parameters...)
|
---|
| 48 |
|
---|
| 49 | Constructor for creating a connection to the database.
|
---|
| 50 | Returns a Connection Object. It takes a number of
|
---|
| 51 | parameters which are database dependent. [1]
|
---|
| 52 |
|
---|
| 53 | These module globals must be defined:
|
---|
| 54 |
|
---|
| 55 | apilevel
|
---|
| 56 |
|
---|
| 57 | String constant stating the supported DB API level.
|
---|
| 58 | Currently only the strings '1.0' and '2.0' are allowed.
|
---|
| 59 |
|
---|
| 60 | If not given, a DB-API 1.0 level interface should be
|
---|
| 61 | assumed.
|
---|
| 62 |
|
---|
| 63 | threadsafety
|
---|
| 64 |
|
---|
| 65 | Integer constant stating the level of thread safety the
|
---|
| 66 | interface supports. Possible values are:
|
---|
| 67 |
|
---|
| 68 | 0 Threads may not share the module.
|
---|
| 69 | 1 Threads may share the module, but not connections.
|
---|
| 70 | 2 Threads may share the module and connections.
|
---|
| 71 | 3 Threads may share the module, connections and
|
---|
| 72 | cursors.
|
---|
| 73 |
|
---|
| 74 | Sharing in the above context means that two threads may
|
---|
| 75 | use a resource without wrapping it using a mutex semaphore
|
---|
| 76 | to implement resource locking. Note that you cannot always
|
---|
| 77 | make external resources thread safe by managing access
|
---|
| 78 | using a mutex: the resource may rely on global variables
|
---|
| 79 | or other external sources that are beyond your control.
|
---|
| 80 |
|
---|
| 81 | paramstyle
|
---|
| 82 |
|
---|
| 83 | String constant stating the type of parameter marker
|
---|
| 84 | formatting expected by the interface. Possible values are
|
---|
| 85 | [2]:
|
---|
| 86 |
|
---|
| 87 | 'qmark' Question mark style,
|
---|
| 88 | e.g. '...WHERE name=?'
|
---|
| 89 | 'numeric' Numeric, positional style,
|
---|
| 90 | e.g. '...WHERE name=:1'
|
---|
| 91 | 'named' Named style,
|
---|
| 92 | e.g. '...WHERE name=:name'
|
---|
| 93 | 'format' ANSI C printf format codes,
|
---|
| 94 | e.g. '...WHERE name=%s'
|
---|
| 95 | 'pyformat' Python extended format codes,
|
---|
| 96 | e.g. '...WHERE name=%(name)s'
|
---|
| 97 |
|
---|
| 98 | The module should make all error information available through
|
---|
| 99 | these exceptions or subclasses thereof:
|
---|
| 100 |
|
---|
| 101 | Warning
|
---|
| 102 |
|
---|
| 103 | Exception raised for important warnings like data
|
---|
| 104 | truncations while inserting, etc. It must be a subclass of
|
---|
| 105 | the Python StandardError (defined in the module
|
---|
| 106 | exceptions).
|
---|
| 107 |
|
---|
| 108 | Error
|
---|
| 109 |
|
---|
| 110 | Exception that is the base class of all other error
|
---|
| 111 | exceptions. You can use this to catch all errors with one
|
---|
| 112 | single 'except' statement. Warnings are not considered
|
---|
| 113 | errors and thus should not use this class as base. It must
|
---|
| 114 | be a subclass of the Python StandardError (defined in the
|
---|
| 115 | module exceptions).
|
---|
| 116 |
|
---|
| 117 | InterfaceError
|
---|
| 118 |
|
---|
| 119 | Exception raised for errors that are related to the
|
---|
| 120 | database interface rather than the database itself. It
|
---|
| 121 | must be a subclass of Error.
|
---|
| 122 |
|
---|
| 123 | DatabaseError
|
---|
| 124 |
|
---|
| 125 | Exception raised for errors that are related to the
|
---|
| 126 | database. It must be a subclass of Error.
|
---|
| 127 |
|
---|
| 128 | DataError
|
---|
| 129 |
|
---|
| 130 | Exception raised for errors that are due to problems with
|
---|
| 131 | the processed data like division by zero, numeric value
|
---|
| 132 | out of range, etc. It must be a subclass of DatabaseError.
|
---|
| 133 |
|
---|
| 134 | OperationalError
|
---|
| 135 |
|
---|
| 136 | Exception raised for errors that are related to the
|
---|
| 137 | database's operation and not necessarily under the control
|
---|
| 138 | of the programmer, e.g. an unexpected disconnect occurs,
|
---|
| 139 | the data source name is not found, a transaction could not
|
---|
| 140 | be processed, a memory allocation error occurred during
|
---|
| 141 | processing, etc. It must be a subclass of DatabaseError.
|
---|
| 142 |
|
---|
| 143 | IntegrityError
|
---|
| 144 |
|
---|
| 145 | Exception raised when the relational integrity of the
|
---|
| 146 | database is affected, e.g. a foreign key check fails. It
|
---|
| 147 | must be a subclass of DatabaseError.
|
---|
| 148 |
|
---|
| 149 | InternalError
|
---|
| 150 |
|
---|
| 151 | Exception raised when the database encounters an internal
|
---|
| 152 | error, e.g. the cursor is not valid anymore, the
|
---|
| 153 | transaction is out of sync, etc. It must be a subclass of
|
---|
| 154 | DatabaseError.
|
---|
| 155 |
|
---|
| 156 | ProgrammingError
|
---|
| 157 |
|
---|
| 158 | Exception raised for programming errors, e.g. table not
|
---|
| 159 | found or already exists, syntax error in the SQL
|
---|
| 160 | statement, wrong number of parameters specified, etc. It
|
---|
| 161 | must be a subclass of DatabaseError.
|
---|
| 162 |
|
---|
| 163 | NotSupportedError
|
---|
| 164 |
|
---|
| 165 | Exception raised in case a method or database API was used
|
---|
| 166 | which is not supported by the database, e.g. requesting a
|
---|
| 167 | .rollback() on a connection that does not support
|
---|
| 168 | transaction or has transactions turned off. It must be a
|
---|
| 169 | subclass of DatabaseError.
|
---|
| 170 |
|
---|
| 171 | This is the exception inheritance layout:
|
---|
| 172 |
|
---|
| 173 | StandardError
|
---|
| 174 | |__Warning
|
---|
| 175 | |__Error
|
---|
| 176 | |__InterfaceError
|
---|
| 177 | |__DatabaseError
|
---|
| 178 | |__DataError
|
---|
| 179 | |__OperationalError
|
---|
| 180 | |__IntegrityError
|
---|
| 181 | |__InternalError
|
---|
| 182 | |__ProgrammingError
|
---|
| 183 | |__NotSupportedError
|
---|
| 184 |
|
---|
| 185 | Note: The values of these exceptions are not defined. They should
|
---|
| 186 | give the user a fairly good idea of what went wrong, though.
|
---|
| 187 |
|
---|
| 188 |
|
---|
| 189 |
|
---|
| 190 | Connection Objects
|
---|
| 191 |
|
---|
| 192 | Connection Objects should respond to the following methods:
|
---|
| 193 |
|
---|
| 194 | .close()
|
---|
| 195 |
|
---|
| 196 | Close the connection now (rather than whenever __del__ is
|
---|
| 197 | called). The connection will be unusable from this point
|
---|
| 198 | forward; an Error (or subclass) exception will be raised
|
---|
| 199 | if any operation is attempted with the connection. The
|
---|
| 200 | same applies to all cursor objects trying to use the
|
---|
| 201 | connection. Note that closing a connection without
|
---|
| 202 | committing the changes first will cause an implicit
|
---|
| 203 | rollback to be performed.
|
---|
| 204 |
|
---|
| 205 |
|
---|
| 206 | .commit()
|
---|
| 207 |
|
---|
| 208 | Commit any pending transaction to the database. Note that
|
---|
| 209 | if the database supports an auto-commit feature, this must
|
---|
| 210 | be initially off. An interface method may be provided to
|
---|
| 211 | turn it back on.
|
---|
| 212 |
|
---|
| 213 | Database modules that do not support transactions should
|
---|
| 214 | implement this method with void functionality.
|
---|
| 215 |
|
---|
| 216 | .rollback()
|
---|
| 217 |
|
---|
| 218 | This method is optional since not all databases provide
|
---|
| 219 | transaction support. [3]
|
---|
| 220 |
|
---|
| 221 | In case a database does provide transactions this method
|
---|
| 222 | causes the the database to roll back to the start of any
|
---|
| 223 | pending transaction. Closing a connection without
|
---|
| 224 | committing the changes first will cause an implicit
|
---|
| 225 | rollback to be performed.
|
---|
| 226 |
|
---|
| 227 | .cursor()
|
---|
| 228 |
|
---|
| 229 | Return a new Cursor Object using the connection. If the
|
---|
| 230 | database does not provide a direct cursor concept, the
|
---|
| 231 | module will have to emulate cursors using other means to
|
---|
| 232 | the extent needed by this specification. [4]
|
---|
| 233 |
|
---|
| 234 |
|
---|
| 235 |
|
---|
| 236 | Cursor Objects
|
---|
| 237 |
|
---|
| 238 | These objects represent a database cursor, which is used to
|
---|
| 239 | manage the context of a fetch operation. Cursors created from
|
---|
| 240 | the same connection are not isolated, i.e., any changes
|
---|
| 241 | done to the database by a cursor are immediately visible by the
|
---|
| 242 | other cursors. Cursors created from different connections can
|
---|
| 243 | or can not be isolated, depending on how the transaction support
|
---|
| 244 | is implemented (see also the connection's rollback() and commit()
|
---|
| 245 | methods.)
|
---|
| 246 |
|
---|
| 247 | Cursor Objects should respond to the following methods and
|
---|
| 248 | attributes:
|
---|
| 249 |
|
---|
| 250 | .description
|
---|
| 251 |
|
---|
| 252 | This read-only attribute is a sequence of 7-item
|
---|
| 253 | sequences. Each of these sequences contains information
|
---|
| 254 | describing one result column: (name, type_code,
|
---|
| 255 | display_size, internal_size, precision, scale,
|
---|
| 256 | null_ok). The first two items (name and type_code) are
|
---|
| 257 | mandatory, the other five are optional and must be set to
|
---|
| 258 | None if meaningfull values are not provided.
|
---|
| 259 |
|
---|
| 260 | This attribute will be None for operations that
|
---|
| 261 | do not return rows or if the cursor has not had an
|
---|
| 262 | operation invoked via the executeXXX() method yet.
|
---|
| 263 |
|
---|
| 264 | The type_code can be interpreted by comparing it to the
|
---|
| 265 | Type Objects specified in the section below.
|
---|
| 266 |
|
---|
| 267 | .rowcount
|
---|
| 268 |
|
---|
| 269 | This read-only attribute specifies the number of rows that
|
---|
| 270 | the last executeXXX() produced (for DQL statements like
|
---|
| 271 | 'select') or affected (for DML statements like 'update' or
|
---|
| 272 | 'insert').
|
---|
| 273 |
|
---|
| 274 | The attribute is -1 in case no executeXXX() has been
|
---|
| 275 | performed on the cursor or the rowcount of the last
|
---|
| 276 | operation is not determinable by the interface. [7]
|
---|
| 277 |
|
---|
| 278 | Note: Future versions of the DB API specification could
|
---|
| 279 | redefine the latter case to have the object return None
|
---|
| 280 | instead of -1.
|
---|
| 281 |
|
---|
| 282 | .callproc(procname[,parameters])
|
---|
| 283 |
|
---|
| 284 | (This method is optional since not all databases provide
|
---|
| 285 | stored procedures. [3])
|
---|
| 286 |
|
---|
| 287 | Call a stored database procedure with the given name. The
|
---|
| 288 | sequence of parameters must contain one entry for each
|
---|
| 289 | argument that the procedure expects. The result of the
|
---|
| 290 | call is returned as modified copy of the input
|
---|
| 291 | sequence. Input parameters are left untouched, output and
|
---|
| 292 | input/output parameters replaced with possibly new values.
|
---|
| 293 |
|
---|
| 294 | The procedure may also provide a result set as
|
---|
| 295 | output. This must then be made available through the
|
---|
| 296 | standard fetchXXX() methods.
|
---|
| 297 |
|
---|
| 298 | .close()
|
---|
| 299 |
|
---|
| 300 | Close the cursor now (rather than whenever __del__ is
|
---|
| 301 | called). The cursor will be unusable from this point
|
---|
| 302 | forward; an Error (or subclass) exception will be raised
|
---|
| 303 | if any operation is attempted with the cursor.
|
---|
| 304 |
|
---|
| 305 | .execute(operation[,parameters])
|
---|
| 306 |
|
---|
| 307 | Prepare and execute a database operation (query or
|
---|
| 308 | command). Parameters may be provided as sequence or
|
---|
| 309 | mapping and will be bound to variables in the operation.
|
---|
| 310 | Variables are specified in a database-specific notation
|
---|
| 311 | (see the module's paramstyle attribute for details). [5]
|
---|
| 312 |
|
---|
| 313 | A reference to the operation will be retained by the
|
---|
| 314 | cursor. If the same operation object is passed in again,
|
---|
| 315 | then the cursor can optimize its behavior. This is most
|
---|
| 316 | effective for algorithms where the same operation is used,
|
---|
| 317 | but different parameters are bound to it (many times).
|
---|
| 318 |
|
---|
| 319 | For maximum efficiency when reusing an operation, it is
|
---|
| 320 | best to use the setinputsizes() method to specify the
|
---|
| 321 | parameter types and sizes ahead of time. It is legal for
|
---|
| 322 | a parameter to not match the predefined information; the
|
---|
| 323 | implementation should compensate, possibly with a loss of
|
---|
| 324 | efficiency.
|
---|
| 325 |
|
---|
| 326 | The parameters may also be specified as list of tuples to
|
---|
| 327 | e.g. insert multiple rows in a single operation, but this
|
---|
| 328 | kind of usage is depreciated: executemany() should be used
|
---|
| 329 | instead.
|
---|
| 330 |
|
---|
| 331 | Return values are not defined.
|
---|
| 332 |
|
---|
| 333 | .executemany(operation,seq_of_parameters)
|
---|
| 334 |
|
---|
| 335 | Prepare a database operation (query or command) and then
|
---|
| 336 | execute it against all parameter sequences or mappings
|
---|
| 337 | found in the sequence seq_of_parameters.
|
---|
| 338 |
|
---|
| 339 | Modules are free to implement this method using multiple
|
---|
| 340 | calls to the execute() method or by using array operations
|
---|
| 341 | to have the database process the sequence as a whole in
|
---|
| 342 | one call.
|
---|
| 343 |
|
---|
| 344 | Use of this method for an operation which produces one or
|
---|
| 345 | more result sets constitutes undefined behavior, and the
|
---|
| 346 | implementation is permitted (but not required) to raise
|
---|
| 347 | an exception when it detects that a result set has been
|
---|
| 348 | created by an invocation of the operation.
|
---|
| 349 |
|
---|
| 350 | The same comments as for execute() also apply accordingly
|
---|
| 351 | to this method.
|
---|
| 352 |
|
---|
| 353 | Return values are not defined.
|
---|
| 354 |
|
---|
| 355 | .fetchone()
|
---|
| 356 |
|
---|
| 357 | Fetch the next row of a query result set, returning a
|
---|
| 358 | single sequence, or None when no more data is
|
---|
| 359 | available. [6]
|
---|
| 360 |
|
---|
| 361 | An Error (or subclass) exception is raised if the previous
|
---|
| 362 | call to executeXXX() did not produce any result set or no
|
---|
| 363 | call was issued yet.
|
---|
| 364 |
|
---|
| 365 | fetchmany([size=cursor.arraysize])
|
---|
| 366 |
|
---|
| 367 | Fetch the next set of rows of a query result, returning a
|
---|
| 368 | sequence of sequences (e.g. a list of tuples). An empty
|
---|
| 369 | sequence is returned when no more rows are available.
|
---|
| 370 |
|
---|
| 371 | The number of rows to fetch per call is specified by the
|
---|
| 372 | parameter. If it is not given, the cursor's arraysize
|
---|
| 373 | determines the number of rows to be fetched. The method
|
---|
| 374 | should try to fetch as many rows as indicated by the size
|
---|
| 375 | parameter. If this is not possible due to the specified
|
---|
| 376 | number of rows not being available, fewer rows may be
|
---|
| 377 | returned.
|
---|
| 378 |
|
---|
| 379 | An Error (or subclass) exception is raised if the previous
|
---|
| 380 | call to executeXXX() did not produce any result set or no
|
---|
| 381 | call was issued yet.
|
---|
| 382 |
|
---|
| 383 | Note there are performance considerations involved with
|
---|
| 384 | the size parameter. For optimal performance, it is
|
---|
| 385 | usually best to use the arraysize attribute. If the size
|
---|
| 386 | parameter is used, then it is best for it to retain the
|
---|
| 387 | same value from one fetchmany() call to the next.
|
---|
| 388 |
|
---|
| 389 | .fetchall()
|
---|
| 390 |
|
---|
| 391 | Fetch all (remaining) rows of a query result, returning
|
---|
| 392 | them as a sequence of sequences (e.g. a list of tuples).
|
---|
| 393 | Note that the cursor's arraysize attribute can affect the
|
---|
| 394 | performance of this operation.
|
---|
| 395 |
|
---|
| 396 | An Error (or subclass) exception is raised if the previous
|
---|
| 397 | call to executeXXX() did not produce any result set or no
|
---|
| 398 | call was issued yet.
|
---|
| 399 |
|
---|
| 400 | .nextset()
|
---|
| 401 |
|
---|
| 402 | (This method is optional since not all databases support
|
---|
| 403 | multiple result sets. [3])
|
---|
| 404 |
|
---|
| 405 | This method will make the cursor skip to the next
|
---|
| 406 | available set, discarding any remaining rows from the
|
---|
| 407 | current set.
|
---|
| 408 |
|
---|
| 409 | If there are no more sets, the method returns
|
---|
| 410 | None. Otherwise, it returns a true value and subsequent
|
---|
| 411 | calls to the fetch methods will return rows from the next
|
---|
| 412 | result set.
|
---|
| 413 |
|
---|
| 414 | An Error (or subclass) exception is raised if the previous
|
---|
| 415 | call to executeXXX() did not produce any result set or no
|
---|
| 416 | call was issued yet.
|
---|
| 417 |
|
---|
| 418 | .arraysize
|
---|
| 419 |
|
---|
| 420 | This read/write attribute specifies the number of rows to
|
---|
| 421 | fetch at a time with fetchmany(). It defaults to 1 meaning
|
---|
| 422 | to fetch a single row at a time.
|
---|
| 423 |
|
---|
| 424 | Implementations must observe this value with respect to
|
---|
| 425 | the fetchmany() method, but are free to interact with the
|
---|
| 426 | database a single row at a time. It may also be used in
|
---|
| 427 | the implementation of executemany().
|
---|
| 428 |
|
---|
| 429 | .setinputsizes(sizes)
|
---|
| 430 |
|
---|
| 431 | This can be used before a call to executeXXX() to
|
---|
| 432 | predefine memory areas for the operation's parameters.
|
---|
| 433 |
|
---|
| 434 | sizes is specified as a sequence -- one item for each
|
---|
| 435 | input parameter. The item should be a Type Object that
|
---|
| 436 | corresponds to the input that will be used, or it should
|
---|
| 437 | be an integer specifying the maximum length of a string
|
---|
| 438 | parameter. If the item is None, then no predefined memory
|
---|
| 439 | area will be reserved for that column (this is useful to
|
---|
| 440 | avoid predefined areas for large inputs).
|
---|
| 441 |
|
---|
| 442 | This method would be used before the executeXXX() method
|
---|
| 443 | is invoked.
|
---|
| 444 |
|
---|
| 445 | Implementations are free to have this method do nothing
|
---|
| 446 | and users are free to not use it.
|
---|
| 447 |
|
---|
| 448 | .setoutputsize(size[,column])
|
---|
| 449 |
|
---|
| 450 | Set a column buffer size for fetches of large columns
|
---|
| 451 | (e.g. LONGs, BLOBs, etc.). The column is specified as an
|
---|
| 452 | index into the result sequence. Not specifying the column
|
---|
| 453 | will set the default size for all large columns in the
|
---|
| 454 | cursor.
|
---|
| 455 |
|
---|
| 456 | This method would be used before the executeXXX() method
|
---|
| 457 | is invoked.
|
---|
| 458 |
|
---|
| 459 | Implementations are free to have this method do nothing
|
---|
| 460 | and users are free to not use it.
|
---|
| 461 |
|
---|
| 462 |
|
---|
| 463 |
|
---|
| 464 | Type Objects and Constructors
|
---|
| 465 |
|
---|
| 466 | Many databases need to have the input in a particular format for
|
---|
| 467 | binding to an operation's input parameters. For example, if an
|
---|
| 468 | input is destined for a DATE column, then it must be bound to the
|
---|
| 469 | database in a particular string format. Similar problems exist
|
---|
| 470 | for "Row ID" columns or large binary items (e.g. blobs or RAW
|
---|
| 471 | columns). This presents problems for Python since the parameters
|
---|
| 472 | to the executeXXX() method are untyped. When the database module
|
---|
| 473 | sees a Python string object, it doesn't know if it should be bound
|
---|
| 474 | as a simple CHAR column, as a raw BINARY item, or as a DATE.
|
---|
| 475 |
|
---|
| 476 | To overcome this problem, a module must provide the constructors
|
---|
| 477 | defined below to create objects that can hold special values.
|
---|
| 478 | When passed to the cursor methods, the module can then detect the
|
---|
| 479 | proper type of the input parameter and bind it accordingly.
|
---|
| 480 |
|
---|
| 481 | A Cursor Object's description attribute returns information about
|
---|
| 482 | each of the result columns of a query. The type_code must compare
|
---|
| 483 | equal to one of Type Objects defined below. Type Objects may be
|
---|
| 484 | equal to more than one type code (e.g. DATETIME could be equal to
|
---|
| 485 | the type codes for date, time and timestamp columns; see the
|
---|
| 486 | Implementation Hints below for details).
|
---|
| 487 |
|
---|
| 488 | The module exports the following constructors and singletons:
|
---|
| 489 |
|
---|
| 490 | Date(year,month,day)
|
---|
| 491 |
|
---|
| 492 | This function constructs an object holding a date value.
|
---|
| 493 |
|
---|
| 494 | Time(hour,minute,second)
|
---|
| 495 |
|
---|
| 496 | This function constructs an object holding a time value.
|
---|
| 497 |
|
---|
| 498 | Timestamp(year,month,day,hour,minute,second)
|
---|
| 499 |
|
---|
| 500 | This function constructs an object holding a time stamp
|
---|
| 501 | value.
|
---|
| 502 |
|
---|
| 503 | DateFromTicks(ticks)
|
---|
| 504 |
|
---|
| 505 | This function constructs an object holding a date value
|
---|
| 506 | from the given ticks value (number of seconds since the
|
---|
| 507 | epoch; see the documentation of the standard Python time
|
---|
| 508 | module for details).
|
---|
| 509 |
|
---|
| 510 | TimeFromTicks(ticks)
|
---|
| 511 |
|
---|
| 512 | This function constructs an object holding a time value
|
---|
| 513 | from the given ticks value (number of seconds since the
|
---|
| 514 | epoch; see the documentation of the standard Python time
|
---|
| 515 | module for details).
|
---|
| 516 |
|
---|
| 517 | TimestampFromTicks(ticks)
|
---|
| 518 |
|
---|
| 519 | This function constructs an object holding a time stamp
|
---|
| 520 | value from the given ticks value (number of seconds since
|
---|
| 521 | the epoch; see the documentation of the standard Python
|
---|
| 522 | time module for details).
|
---|
| 523 |
|
---|
| 524 | Binary(string)
|
---|
| 525 |
|
---|
| 526 | This function constructs an object capable of holding a
|
---|
| 527 | binary (long) string value.
|
---|
| 528 |
|
---|
| 529 |
|
---|
| 530 | STRING
|
---|
| 531 |
|
---|
| 532 | This type object is used to describe columns in a database
|
---|
| 533 | that are string-based (e.g. CHAR).
|
---|
| 534 |
|
---|
| 535 | BINARY
|
---|
| 536 |
|
---|
| 537 | This type object is used to describe (long) binary columns
|
---|
| 538 | in a database (e.g. LONG, RAW, BLOBs).
|
---|
| 539 |
|
---|
| 540 | NUMBER
|
---|
| 541 |
|
---|
| 542 | This type object is used to describe numeric columns in a
|
---|
| 543 | database.
|
---|
| 544 |
|
---|
| 545 | DATETIME
|
---|
| 546 |
|
---|
| 547 | This type object is used to describe date/time columns in
|
---|
| 548 | a database.
|
---|
| 549 |
|
---|
| 550 | ROWID
|
---|
| 551 |
|
---|
| 552 | This type object is used to describe the "Row ID" column
|
---|
| 553 | in a database.
|
---|
| 554 |
|
---|
| 555 | SQL NULL values are represented by the Python None singleton on
|
---|
| 556 | input and output.
|
---|
| 557 |
|
---|
| 558 | Note: Usage of Unix ticks for database interfacing can cause
|
---|
| 559 | troubles because of the limited date range they cover.
|
---|
| 560 |
|
---|
| 561 |
|
---|
| 562 |
|
---|
| 563 | Implementation Hints for Module Authors
|
---|
| 564 |
|
---|
| 565 | * The preferred object types for the date/time objects are those
|
---|
| 566 | defined in the mxDateTime package. It provides all necessary
|
---|
| 567 | constructors and methods both at Python and C level.
|
---|
| 568 |
|
---|
| 569 | * The preferred object type for Binary objects are the
|
---|
| 570 | buffer types available in standard Python starting with
|
---|
| 571 | version 1.5.2. Please see the Python documentation for
|
---|
| 572 | details. For information about the the C interface have a
|
---|
| 573 | look at Include/bufferobject.h and
|
---|
| 574 | Objects/bufferobject.c in the Python source
|
---|
| 575 | distribution.
|
---|
| 576 |
|
---|
| 577 | * Starting with Python 2.3, module authors can also use the object
|
---|
| 578 | types defined in the standard datetime module for date/time
|
---|
| 579 | processing. However, it should be noted that this does not
|
---|
| 580 | expose a C API like mxDateTime does which means that integration
|
---|
| 581 | with C based database modules is more difficult.
|
---|
| 582 |
|
---|
| 583 | * Here is a sample implementation of the Unix ticks based
|
---|
| 584 | constructors for date/time delegating work to the generic
|
---|
| 585 | constructors:
|
---|
| 586 |
|
---|
| 587 | import time
|
---|
| 588 |
|
---|
| 589 | def DateFromTicks(ticks):
|
---|
| 590 | return apply(Date,time.localtime(ticks)[:3])
|
---|
| 591 |
|
---|
| 592 | def TimeFromTicks(ticks):
|
---|
| 593 | return apply(Time,time.localtime(ticks)[3:6])
|
---|
| 594 |
|
---|
| 595 | def TimestampFromTicks(ticks):
|
---|
| 596 | return apply(Timestamp,time.localtime(ticks)[:6])
|
---|
| 597 |
|
---|
| 598 | * This Python class allows implementing the above type
|
---|
| 599 | objects even though the description type code field yields
|
---|
| 600 | multiple values for on type object:
|
---|
| 601 |
|
---|
| 602 | class DBAPITypeObject:
|
---|
| 603 | def __init__(self,*values):
|
---|
| 604 | self.values = values
|
---|
| 605 | def __cmp__(self,other):
|
---|
| 606 | if other in self.values:
|
---|
| 607 | return 0
|
---|
| 608 | if other < self.values:
|
---|
| 609 | return 1
|
---|
| 610 | else:
|
---|
| 611 | return -1
|
---|
| 612 |
|
---|
| 613 | The resulting type object compares equal to all values
|
---|
| 614 | passed to the constructor.
|
---|
| 615 |
|
---|
| 616 | * Here is a snippet of Python code that implements the exception
|
---|
| 617 | hierarchy defined above:
|
---|
| 618 |
|
---|
| 619 | import exceptions
|
---|
| 620 |
|
---|
| 621 | class Error(exceptions.StandardError):
|
---|
| 622 | pass
|
---|
| 623 |
|
---|
| 624 | class Warning(exceptions.StandardError):
|
---|
| 625 | pass
|
---|
| 626 |
|
---|
| 627 | class InterfaceError(Error):
|
---|
| 628 | pass
|
---|
| 629 |
|
---|
| 630 | class DatabaseError(Error):
|
---|
| 631 | pass
|
---|
| 632 |
|
---|
| 633 | class InternalError(DatabaseError):
|
---|
| 634 | pass
|
---|
| 635 |
|
---|
| 636 | class OperationalError(DatabaseError):
|
---|
| 637 | pass
|
---|
| 638 |
|
---|
| 639 | class ProgrammingError(DatabaseError):
|
---|
| 640 | pass
|
---|
| 641 |
|
---|
| 642 | class IntegrityError(DatabaseError):
|
---|
| 643 | pass
|
---|
| 644 |
|
---|
| 645 | class DataError(DatabaseError):
|
---|
| 646 | pass
|
---|
| 647 |
|
---|
| 648 | class NotSupportedError(DatabaseError):
|
---|
| 649 | pass
|
---|
| 650 |
|
---|
| 651 | In C you can use the PyErr_NewException(fullname,
|
---|
| 652 | base, NULL) API to create the exception objects.
|
---|
| 653 |
|
---|
| 654 |
|
---|
| 655 |
|
---|
| 656 | Optional DB API Extensions
|
---|
| 657 |
|
---|
| 658 | During the lifetime of DB API 2.0, module authors have often
|
---|
| 659 | extended their implementations beyond what is required by this DB
|
---|
| 660 | API specification. To enhance compatibility and to provide a clean
|
---|
| 661 | upgrade path to possible future versions of the specification,
|
---|
| 662 | this section defines a set of common extensions to the core DB API
|
---|
| 663 | 2.0 specification.
|
---|
| 664 |
|
---|
| 665 | As with all DB API optional features, the database module authors
|
---|
| 666 | are free to not implement these additional attributes and methods
|
---|
| 667 | (using them will then result in an AttributeError) or to raise a
|
---|
| 668 | NotSupportedError in case the availability can only be checked at
|
---|
| 669 | run-time.
|
---|
| 670 |
|
---|
| 671 | It has been proposed to make usage of these extensions optionally
|
---|
| 672 | visible to the programmer by issuing Python warnings through the
|
---|
| 673 | Python warning framework. To make this feature useful, the warning
|
---|
| 674 | messages must be standardized in order to be able to mask them. These
|
---|
| 675 | standard messages are referred to below as "Warning Message".
|
---|
| 676 |
|
---|
| 677 | Cursor Attribute .rownumber
|
---|
| 678 |
|
---|
| 679 | This read-only attribute should provide the current 0-based
|
---|
| 680 | index of the cursor in the result set or None if the index cannot
|
---|
| 681 | be determined.
|
---|
| 682 |
|
---|
| 683 | The index can be seen as index of the cursor in a sequence (the
|
---|
| 684 | result set). The next fetch operation will fetch the row
|
---|
| 685 | indexed by .rownumber in that sequence.
|
---|
| 686 |
|
---|
| 687 | Warning Message: "DB-API extension cursor.rownumber used"
|
---|
| 688 |
|
---|
| 689 | Connection Attributes .Error, .ProgrammingError, etc.
|
---|
| 690 |
|
---|
| 691 | All exception classes defined by the DB API standard should be
|
---|
| 692 | exposed on the Connection objects are attributes (in addition
|
---|
| 693 | to being available at module scope).
|
---|
| 694 |
|
---|
| 695 | These attributes simplify error handling in multi-connection
|
---|
| 696 | environments.
|
---|
| 697 |
|
---|
| 698 | Warning Message: "DB-API extension connection.<exception> used"
|
---|
| 699 |
|
---|
| 700 | Cursor Attributes .connection
|
---|
| 701 |
|
---|
| 702 | This read-only attribute return a reference to the Connection
|
---|
| 703 | object on which the cursor was created.
|
---|
| 704 |
|
---|
| 705 | The attribute simplifies writing polymorph code in
|
---|
| 706 | multi-connection environments.
|
---|
| 707 |
|
---|
| 708 | Warning Message: "DB-API extension cursor.connection used"
|
---|
| 709 |
|
---|
| 710 | Cursor Method .scroll(value[,mode='relative'])
|
---|
| 711 |
|
---|
| 712 | Scroll the cursor in the result set to a new position according
|
---|
| 713 | to mode.
|
---|
| 714 |
|
---|
| 715 | If mode is 'relative' (default), value is taken as offset to
|
---|
| 716 | the current position in the result set, if set to 'absolute',
|
---|
| 717 | value states an absolute target position.
|
---|
| 718 |
|
---|
| 719 | An IndexError should be raised in case a scroll operation would
|
---|
| 720 | leave the result set. In this case, the cursor position is left
|
---|
| 721 | undefined (ideal would be to not move the cursor at all).
|
---|
| 722 |
|
---|
| 723 | Note: This method should use native scrollable cursors, if
|
---|
| 724 | available , or revert to an emulation for forward-only
|
---|
| 725 | scrollable cursors. The method may raise NotSupportedErrors to
|
---|
| 726 | signal that a specific operation is not supported by the
|
---|
| 727 | database (e.g. backward scrolling).
|
---|
| 728 |
|
---|
| 729 | Warning Message: "DB-API extension cursor.scroll() used"
|
---|
| 730 |
|
---|
| 731 | Cursor Attribute .messages
|
---|
| 732 |
|
---|
| 733 | This is a Python list object to which the interface appends
|
---|
| 734 | tuples (exception class, exception value) for all messages
|
---|
| 735 | which the interfaces receives from the underlying database for
|
---|
| 736 | this cursor.
|
---|
| 737 |
|
---|
| 738 | The list is cleared by all standard cursor methods calls (prior
|
---|
| 739 | to executing the call) except for the .fetchXXX() calls
|
---|
| 740 | automatically to avoid excessive memory usage and can also be
|
---|
| 741 | cleared by executing "del cursor.messages[:]".
|
---|
| 742 |
|
---|
| 743 | All error and warning messages generated by the database are
|
---|
| 744 | placed into this list, so checking the list allows the user to
|
---|
| 745 | verify correct operation of the method calls.
|
---|
| 746 |
|
---|
| 747 | The aim of this attribute is to eliminate the need for a
|
---|
| 748 | Warning exception which often causes problems (some warnings
|
---|
| 749 | really only have informational character).
|
---|
| 750 |
|
---|
| 751 | Warning Message: "DB-API extension cursor.messages used"
|
---|
| 752 |
|
---|
| 753 | Connection Attribute .messages
|
---|
| 754 |
|
---|
| 755 | Same as cursor.messages except that the messages in the list
|
---|
| 756 | are connection oriented.
|
---|
| 757 |
|
---|
| 758 | The list is cleared automatically by all standard connection
|
---|
| 759 | methods calls (prior to executing the call) to avoid excessive
|
---|
| 760 | memory usage and can also be cleared by executing "del
|
---|
| 761 | connection.messages[:]".
|
---|
| 762 |
|
---|
| 763 | Warning Message: "DB-API extension connection.messages used"
|
---|
| 764 |
|
---|
| 765 | Cursor Method .next()
|
---|
| 766 |
|
---|
| 767 | Return the next row from the currently executing SQL statement
|
---|
| 768 | using the same semantics as .fetchone(). A StopIteration
|
---|
| 769 | exception is raised when the result set is exhausted for Python
|
---|
| 770 | versions 2.2 and later. Previous versions don't have the
|
---|
| 771 | StopIteration exception and so the method should raise an
|
---|
| 772 | IndexError instead.
|
---|
| 773 |
|
---|
| 774 | Warning Message: "DB-API extension cursor.next() used"
|
---|
| 775 |
|
---|
| 776 | Cursor Method .__iter__()
|
---|
| 777 |
|
---|
| 778 | Return self to make cursors compatible to the iteration protocol.
|
---|
| 779 |
|
---|
| 780 | Warning Message: "DB-API extension cursor.__iter__() used"
|
---|
| 781 |
|
---|
| 782 | Cursor Attribute .lastrowid
|
---|
| 783 |
|
---|
| 784 | This read-only attribute provides the rowid of the last
|
---|
| 785 | modified row (most databases return a rowid only when a single
|
---|
| 786 | INSERT operation is performed). If the operation does not set
|
---|
| 787 | a rowid or if the database does not support rowids, this
|
---|
| 788 | attribute should be set to None.
|
---|
| 789 |
|
---|
| 790 | The semantics of .lastrowid are undefined in case the last
|
---|
| 791 | executed statement modified more than one row, e.g. when
|
---|
| 792 | using INSERT with .executemany().
|
---|
| 793 |
|
---|
| 794 | Warning Message: "DB-API extension cursor.lastrowid used"
|
---|
| 795 |
|
---|
| 796 |
|
---|
| 797 |
|
---|
| 798 | Optional Error Handling Extension
|
---|
| 799 |
|
---|
| 800 | The core DB API specification only introduces a set of exceptions
|
---|
| 801 | which can be raised to report errors to the user. In some cases,
|
---|
| 802 | exceptions may be too disruptive for the flow of a program or even
|
---|
| 803 | render execution impossible.
|
---|
| 804 |
|
---|
| 805 | For these cases and in order to simplify error handling when
|
---|
| 806 | dealing with databases, database module authors may choose to
|
---|
| 807 | implement user defineable error handlers. This section describes a
|
---|
| 808 | standard way of defining these error handlers.
|
---|
| 809 |
|
---|
| 810 | Cursor/Connection Attribute .errorhandler
|
---|
| 811 |
|
---|
| 812 | Read/write attribute which references an error handler to call
|
---|
| 813 | in case an error condition is met.
|
---|
| 814 |
|
---|
| 815 | The handler must be a Python callable taking the following
|
---|
| 816 | arguments: errorhandler(connection, cursor, errorclass,
|
---|
| 817 | errorvalue) where connection is a reference to the connection
|
---|
| 818 | on which the cursor operates, cursor a reference to the cursor
|
---|
| 819 | (or None in case the error does not apply to a cursor),
|
---|
| 820 | errorclass is an error class which to instantiate using
|
---|
| 821 | errorvalue as construction argument.
|
---|
| 822 |
|
---|
| 823 | The standard error handler should add the error information to
|
---|
| 824 | the appropriate .messages attribute (connection.messages or
|
---|
| 825 | cursor.messages) and raise the exception defined by the given
|
---|
| 826 | errorclass and errorvalue parameters.
|
---|
| 827 |
|
---|
| 828 | If no errorhandler is set (the attribute is None), the standard
|
---|
| 829 | error handling scheme as outlined above, should be applied.
|
---|
| 830 |
|
---|
| 831 | Warning Message: "DB-API extension .errorhandler used"
|
---|
| 832 |
|
---|
| 833 | Cursors should inherit the .errorhandler setting from their
|
---|
| 834 | connection objects at cursor creation time.
|
---|
| 835 |
|
---|
| 836 |
|
---|
| 837 |
|
---|
| 838 | Frequently Asked Questions
|
---|
| 839 |
|
---|
| 840 | The database SIG often sees reoccurring questions about the DB API
|
---|
| 841 | specification. This section covers some of the issues people
|
---|
| 842 | sometimes have with the specification.
|
---|
| 843 |
|
---|
| 844 | Question:
|
---|
| 845 |
|
---|
| 846 | How can I construct a dictionary out of the tuples returned by
|
---|
| 847 | .fetchxxx():
|
---|
| 848 |
|
---|
| 849 | Answer:
|
---|
| 850 |
|
---|
| 851 | There are several existing tools available which provide
|
---|
| 852 | helpers for this task. Most of them use the approach of using
|
---|
| 853 | the column names defined in the cursor attribute .description
|
---|
| 854 | as basis for the keys in the row dictionary.
|
---|
| 855 |
|
---|
| 856 | Note that the reason for not extending the DB API specification
|
---|
| 857 | to also support dictionary return values for the .fetchxxx()
|
---|
| 858 | methods is that this approach has several drawbacks:
|
---|
| 859 |
|
---|
| 860 | * Some databases don't support case-sensitive column names or
|
---|
| 861 | auto-convert them to all lowercase or all uppercase
|
---|
| 862 | characters.
|
---|
| 863 |
|
---|
| 864 | * Columns in the result set which are generated by the query
|
---|
| 865 | (e.g. using SQL functions) don't map to table column names
|
---|
| 866 | and databases usually generate names for these columns in a
|
---|
| 867 | very database specific way.
|
---|
| 868 |
|
---|
| 869 | As a result, accessing the columns through dictionary keys
|
---|
| 870 | varies between databases and makes writing portable code
|
---|
| 871 | impossible.
|
---|
| 872 |
|
---|
| 873 |
|
---|
| 874 |
|
---|
| 875 | Major Changes from Version 1.0 to Version 2.0
|
---|
| 876 |
|
---|
| 877 | The Python Database API 2.0 introduces a few major changes
|
---|
| 878 | compared to the 1.0 version. Because some of these changes will
|
---|
| 879 | cause existing DB API 1.0 based scripts to break, the major
|
---|
| 880 | version number was adjusted to reflect this change.
|
---|
| 881 |
|
---|
| 882 | These are the most important changes from 1.0 to 2.0:
|
---|
| 883 |
|
---|
| 884 | * The need for a separate dbi module was dropped and the
|
---|
| 885 | functionality merged into the module interface itself.
|
---|
| 886 |
|
---|
| 887 | * New constructors and Type Objects were added for date/time
|
---|
| 888 | values, the RAW Type Object was renamed to BINARY. The
|
---|
| 889 | resulting set should cover all basic data types commonly
|
---|
| 890 | found in modern SQL databases.
|
---|
| 891 |
|
---|
| 892 | * New constants (apilevel, threadlevel, paramstyle) and
|
---|
| 893 | methods (executemany, nextset) were added to provide better
|
---|
| 894 | database bindings.
|
---|
| 895 |
|
---|
| 896 | * The semantics of .callproc() needed to call stored
|
---|
| 897 | procedures are now clearly defined.
|
---|
| 898 |
|
---|
| 899 | * The definition of the .execute() return value changed.
|
---|
| 900 | Previously, the return value was based on the SQL statement
|
---|
| 901 | type (which was hard to implement right) -- it is undefined
|
---|
| 902 | now; use the more flexible .rowcount attribute
|
---|
| 903 | instead. Modules are free to return the old style return
|
---|
| 904 | values, but these are no longer mandated by the
|
---|
| 905 | specification and should be considered database interface
|
---|
| 906 | dependent.
|
---|
| 907 |
|
---|
| 908 | * Class based exceptions were incorporated into the
|
---|
| 909 | specification. Module implementors are free to extend the
|
---|
| 910 | exception layout defined in this specification by
|
---|
| 911 | subclassing the defined exception classes.
|
---|
| 912 |
|
---|
| 913 | Post-publishing additions to the DB API 2.0 specification:
|
---|
| 914 |
|
---|
| 915 | * Additional optional DB API extensions to the set of
|
---|
| 916 | core functionality were specified.
|
---|
| 917 |
|
---|
| 918 |
|
---|
| 919 |
|
---|
| 920 | Open Issues
|
---|
| 921 |
|
---|
| 922 | Although the version 2.0 specification clarifies a lot of
|
---|
| 923 | questions that were left open in the 1.0 version, there are still
|
---|
| 924 | some remaining issues which should be addressed in future
|
---|
| 925 | versions:
|
---|
| 926 |
|
---|
| 927 | * Define a useful return value for .nextset() for the case where
|
---|
| 928 | a new result set is available.
|
---|
| 929 |
|
---|
| 930 | * Create a fixed point numeric type for use as loss-less
|
---|
| 931 | monetary and decimal interchange format.
|
---|
| 932 |
|
---|
| 933 |
|
---|
| 934 |
|
---|
| 935 | Footnotes
|
---|
| 936 |
|
---|
| 937 | [1] As a guideline the connection constructor parameters should be
|
---|
| 938 | implemented as keyword parameters for more intuitive use and
|
---|
| 939 | follow this order of parameters:
|
---|
| 940 |
|
---|
| 941 | dsn Data source name as string
|
---|
| 942 | user User name as string (optional)
|
---|
| 943 | password Password as string (optional)
|
---|
| 944 | host Hostname (optional)
|
---|
| 945 | database Database name (optional)
|
---|
| 946 |
|
---|
| 947 | E.g. a connect could look like this:
|
---|
| 948 |
|
---|
| 949 | connect(dsn='myhost:MYDB',user='guido',password='234$')
|
---|
| 950 |
|
---|
| 951 | [2] Module implementors should prefer 'numeric', 'named' or
|
---|
| 952 | 'pyformat' over the other formats because these offer more
|
---|
| 953 | clarity and flexibility.
|
---|
| 954 |
|
---|
| 955 | [3] If the database does not support the functionality required
|
---|
| 956 | by the method, the interface should throw an exception in
|
---|
| 957 | case the method is used.
|
---|
| 958 |
|
---|
| 959 | The preferred approach is to not implement the method and
|
---|
| 960 | thus have Python generate an AttributeError in
|
---|
| 961 | case the method is requested. This allows the programmer to
|
---|
| 962 | check for database capabilities using the standard
|
---|
| 963 | hasattr() function.
|
---|
| 964 |
|
---|
| 965 | For some dynamically configured interfaces it may not be
|
---|
| 966 | appropriate to require dynamically making the method
|
---|
| 967 | available. These interfaces should then raise a
|
---|
| 968 | NotSupportedError to indicate the non-ability
|
---|
| 969 | to perform the roll back when the method is invoked.
|
---|
| 970 |
|
---|
| 971 | [4] a database interface may choose to support named cursors by
|
---|
| 972 | allowing a string argument to the method. This feature is
|
---|
| 973 | not part of the specification, since it complicates
|
---|
| 974 | semantics of the .fetchXXX() methods.
|
---|
| 975 |
|
---|
| 976 | [5] The module will use the __getitem__ method of the parameters
|
---|
| 977 | object to map either positions (integers) or names (strings)
|
---|
| 978 | to parameter values. This allows for both sequences and
|
---|
| 979 | mappings to be used as input.
|
---|
| 980 |
|
---|
| 981 | The term "bound" refers to the process of binding an input
|
---|
| 982 | value to a database execution buffer. In practical terms,
|
---|
| 983 | this means that the input value is directly used as a value
|
---|
| 984 | in the operation. The client should not be required to
|
---|
| 985 | "escape" the value so that it can be used -- the value
|
---|
| 986 | should be equal to the actual database value.
|
---|
| 987 |
|
---|
| 988 | [6] Note that the interface may implement row fetching using
|
---|
| 989 | arrays and other optimizations. It is not
|
---|
| 990 | guaranteed that a call to this method will only move the
|
---|
| 991 | associated cursor forward by one row.
|
---|
| 992 |
|
---|
| 993 | [7] The rowcount attribute may be coded in a way that updates
|
---|
| 994 | its value dynamically. This can be useful for databases that
|
---|
| 995 | return usable rowcount values only after the first call to
|
---|
| 996 | a .fetchXXX() method.
|
---|
| 997 |
|
---|
| 998 |
|
---|
| 999 | Acknowledgements
|
---|
| 1000 |
|
---|
| 1001 | Many thanks go to Andrew Kuchling who converted the Python
|
---|
| 1002 | Database API Specification 2.0 from the original HTML format into
|
---|
| 1003 | the PEP format.
|
---|
| 1004 |
|
---|
| 1005 |
|
---|
| 1006 | Copyright
|
---|
| 1007 |
|
---|
| 1008 | This document has been placed in the Public Domain.
|
---|
| 1009 |
|
---|
| 1010 |
|
---|
| 1011 |
|
---|