[DB-SIG] perl-DBI like module for Python?
Kevin Jacobs
jacobs at theopalgroup.com
Wed May 26 08:32:00 EDT 2004
Stuart Bishop wrote:
> On 24/05/2004, at 4:57 PM, Mihai Ibanescu wrote:
>
>> Example: I have my application running against Postgres. I have to be
>> able to
>> port it to Oracle too. Unfortunately, code that tries to catch
>> DatabaseException will have to look for the cx_Oracle
>> DatabaseException, not
>> for the postgres one.
>
>
> The exceptions are most likely exposed through your connection object
> (I think most the major drivers support this option now?).
>
> try:
> cur = con.cursor()
> cur.excecute('select foo from bar')
> except con.DatabaseException:
> print 'Oops!'
>
A more portable way is to use my exception virtualization technique
that allows the use of a standard set of exceptions to catch
exceptions generated from registered db-api modules:
dbapi_exceptions = [ 'Warning',
'Error',
'InterfaceError',
'DatabaseError',
'DataError',
'OperationalError',
'IntegrityError',
'InternalError',
'ProgrammingError',
'NotSupportedError' ]
class Warning (StandardError) : pass
class Error (StandardError) : pass
class InterfaceError (Error) : pass
class DatabaseError (Error) : pass
class DataError (DatabaseError) : pass
class OperationalError (DatabaseError) : pass
class IntegrityError (DatabaseError) : pass
class InternalError (DatabaseError) : pass
class ProgrammingError (DatabaseError) : pass
class NotSupportedError (DatabaseError) : pass
def __import_exceptions(module):
for e in dbapi_exceptions:
sub_exception = getattr(module, e)
global_exception = globals()[e]
if global_exception not in sub_exception.__bases__:
sub_exception.__bases__ += (global_exception,)
One can then "register" a db-api module to allow exceptions to be caught
from the above virtual exceptions:
import psycopg
import popy
import mysqldb
__import_exceptions(psycopg)
__import_exceptions(popy)
__import_exceptions(mysqldb)
-Kevin
More information about the DB-SIG
mailing list