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 |
|
---|