+1
there are also indexes on expressions and partial indexes that can be interesting.
Maybe an Index() object is needed?
Also on introspection. I.e. migrage/fake_migrate should use some hints from system catalogs to reduce the handwork caused by a failed migration whether related to indexes or field and table names.
A common technique to identify schema objects in postgresql, is using comments relative to each created db object for finding them even when renamed. The comment in DAL case, could contain the hash generated by web2py to identify the object (i.e. Table, Field, Index, Sequence, etc.) used in the metainformation files stored in app/databases. Indeed comments could be used to replace on disk files in the long term. Too bad that COMMENT is not a standard which make this path not viable.