/sqlautocode/loader.py

https://code.google.com/p/sqlautocode/ · Python · 32 lines · 22 code · 8 blank · 2 comment · 3 complexity · 651e35f6561406a00f5ab4e85a8ed718 MD5 · raw file

  1. import sqlalchemy
  2. from sqlalchemy.databases import postgres
  3. class AutoLoader(object):
  4. pass
  5. class PGIndexLoader(AutoLoader):
  6. """ SA does not load indexes for us """
  7. sql4indexes = "SELECT indexname, tablename, indexdef FROM pg_indexes"
  8. def __init__(self, db):
  9. ix = {}
  10. for name, tbl_name, sqltext in db.execute(self.sql4indexes):
  11. ix.setdefault(tbl_name, []).append( (name, sqltext) )
  12. self._indexes = ix
  13. def indexes(self, table):
  14. return [self._index_from_def(name, sqltext, table)
  15. for name, sqltext in self._indexes.get(table.name, ())]
  16. def _index_from_def(self, name, sqltext, table):
  17. # CREATE UNIQUE INDEX name ON "tablename" USING btree (columnslist)
  18. unique = ' UNIQUE ' in sqltext
  19. cols = sqltext.split(' (')[1].split(')')[0].split(',')
  20. cols = [table.columns[cname.strip().replace('"', '')]
  21. for cname in cols]
  22. name = name.encode('utf-8')
  23. return sqlalchemy.Index(name, unique=unique, *cols)
  24. postgres.PGDialect.indexloader = PGIndexLoader