Here's an improved way to create indices in the DAL. Works only with
postgresql and sqlite.
def create_indices(*fields):
'''
Creates a set of indices if they do not exist
Use like:
create_indices(db.posts.created_at,
db.users.first_name,
etc...)
'''
for field in fields:
table = field.tablename
column = field.name
db = field.db
if db._uri.startswith('sqlite:'):
db.executesql('create index if not exists %s_%s_index on
%s (%s);'
% (table, column, table, column))
elif db._uri.startswith('postgres:'):
# Our indexes end with "_index", but web2py autogenerates
# one named "_key" for fields created with unique=True.
# So let's check to see if one exists of either form.
index_exists = \
db.executesql("select count(*) from pg_class where
relname='%s_%s_index' or relname='%s_%s_key';"
% (table, column, table, column))[0][0]
== 1
if not index_exists:
db.executesql('create index %s_%s_index on %s (%s);'
% (table, column, table, column))
db.commit()
This improves on this one I posted a while back:
http://groups.google.com/group/web2py/browse_thread/thread/8f6179915a6df8ee/cb58f509ae0a478d?lnk=gst&q=create+index#cb58f509ae0a478d