Virtually all the functionality of the API has been implemented as base classes from which module implementers simply need to derive their own classes, over-riding methods to suit their particular database syntax as necessary.
In particular this requires writing custom converter methods to ensure that the database returns the correct values, overriding the makeConnection() method to convert connect() method parameters to the appropriate form for the driver, and overriding the cursor abstraction methods so that they build the correct SQL strings from the parameters.
web.databaseimplementation comes with basic implementations for PySQLite, web.database and a partial implementation for MySQLdb (transaction support isn't implemented). These can all be used as examples.
If a particular database engine does not natively support part of the API it should be emulated in the derived classes even if it is difficult or slow to do so.