if you need to access legacy tables, all you need - effectively - is not creating the tables: just parse the results to proper python-corresponding types. Same thing applies with inserting/updating: TINYINT, SMALLINT, INT are just integers...with a "forced" lower/upper limit. Those translates to a proper model as
Field('thefield', 'integer', requires=IS_INT_IN_RANGE(...,....))
but that only helps you if you need to do validation before inserting. Python will manage all of those as integers anyways.
As for the primary key, as long it's unique, everything works, EXCEPT something at reaaaally high level as the grid.
Another thing to count for is that web2py assumes a "modern" model in which you CAN'T choose the PK beforehand (this maps to an autoincrementing integer usually): using db.thetable.insert(...) could be troublesome in some edge cases.