# third-party imports
from sqlalchemy import Column, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

Model = declarative_base(name='Model')


class SessionBase(Model):
    __abstract__ = True
 
    id = Column(Integer, primary_key=True)

    engine = None
    session = None
    query = None


    @staticmethod
    def create_session():
        session = sessionmaker(bind=SessionBase.engine)
        SessionBase.session = session()
        return SessionBase.session


    @staticmethod
    def _set_engine(engine):
        SessionBase.engine = engine


    @staticmethod
    def build():
        Model.metadata.create_all(bind=SessionBase.engine)


    @staticmethod
    def connect(dsn):
        e = create_engine(dsn)
        SessionBase._set_engine(e)