from sqlalchemy import event from sqlalchemy.dialects import postgresql from sqlalchemy_utils import view from teal.db import SchemaSQLAlchemy class SQLAlchemy(SchemaSQLAlchemy): """ Superuser must create the required extensions in the public schema of the database, as it is in the `search_path` defined in teal. """ UUID = postgresql.UUID def drop_all(self, bind='__all__', app=None): """A faster nuke-like option to drop everything.""" self.drop_schema() self.drop_schema(schema='common') db = SQLAlchemy(session_options={"autoflush": False}) def create_view(name, selectable): """Creates a view. This is an adaptation from sqlalchemy_utils.view. See `the test on sqlalchemy-utils `_ for an example on how to use. """ table = view.create_table_from_selectable(name=name, selectable=selectable, metadata=None) # We need to ensure views are created / destroyed before / after # SchemaSQLAlchemy's listeners execute # That is why insert=True in 'after_create' event.listen(db.metadata, 'after_create', view.CreateView(name, selectable), insert=True) event.listen(db.metadata, 'before_drop', view.DropView(name)) return table