def vacuum(session, model): """ When making structural changes to version tables (for example dropping columns) there are sometimes situations where some old version records become futile. Vacuum deletes all futile version rows which had no changes compared to previous version. :: from sqlalchemy_continuum import vacuum vacuum(session, User) # vacuums user version :param session: SQLAlchemy session object :param model: SQLAlchemy declarative model class """ version_cls = version_class(model) versions = defaultdict(list) query = (session.query(version_cls).order_by( option(version_cls, 'transaction_column_name'))) for version in query: if versions[version.id]: prev_version = versions[version.id][-1] if naturally_equivalent(prev_version, version): session.delete(version) else: versions[version.id].append(version)
def vacuum(session, model, yield_per=1000): """ When making structural changes to version tables (for example dropping columns) there are sometimes situations where some old version records become futile. Vacuum deletes all futile version rows which had no changes compared to previous version. :: from sqlalchemy_continuum import vacuum vacuum(session, User) # vacuums user version :param session: SQLAlchemy session object :param model: SQLAlchemy declarative model class :param yield_per: how many rows to process at a time """ version_cls = version_class(model) versions = defaultdict(list) query = ( session.query(version_cls) .order_by(option(version_cls, 'transaction_column_name')) ).yield_per(yield_per) primary_key_col = sa.inspection.inspect(model).primary_key[0].name for version in query: version_id = getattr(version, primary_key_col) if versions[version_id]: prev_version = versions[version_id][-1] if naturally_equivalent(prev_version, version): session.delete(version) else: versions[version_id].append(version)
def vacuum(session, model, yield_per=1000): """ When making structural changes to version tables (for example dropping columns) there are sometimes situations where some old version records become futile. Vacuum deletes all futile version rows which had no changes compared to previous version. :: from sqlalchemy_continuum_vendored import vacuum vacuum(session, User) # vacuums user version :param session: SQLAlchemy session object :param model: SQLAlchemy declarative model class :param yield_per: how many rows to process at a time """ version_cls = version_class(model) versions = defaultdict(list) query = ( session.query(version_cls) .order_by(option(version_cls, 'transaction_column_name')) ).yield_per(yield_per) primary_key_col = sa.inspection.inspect(model).primary_key[0].name for version in query: version_id = getattr(version, primary_key_col) if versions[version_id]: prev_version = versions[version_id][-1] if naturally_equivalent(prev_version, version): session.delete(version) else: versions[version_id].append(version)
def vacuum(session, model): """ When making structural changes to history tables (for example dropping columns) there are sometimes situations where some old history records become futile. Vacuum deletes all futile history rows which had no changes compared to previous version. :: from sqlalchemy_continuum import vacuum vacuum(session, User) # vacuums user history :param session: SQLAlchemy session object :param model: SQLAlchemy declarative model class """ history_class = model.__versioned__['class'] manager = model.__versioned__['manager'] versions = defaultdict(list) query = ( session.query(history_class) .order_by(manager.option(history_class, 'transaction_column_name')) ) for version in query: if versions[version.id]: prev_version = versions[version.id][-1] if naturally_equivalent(prev_version, version): session.delete(version) else: versions[version.id].append(version)
def test_returns_true_when_properties_match(self): assert naturally_equivalent( self.User(name=u'someone'), self.User(name=u'someone') )
def test_skips_primary_keys(self): assert naturally_equivalent( self.User(id=1, name=u'someone'), self.User(id=2, name=u'someone') )
def test_skips_primary_keys(self, User): assert naturally_equivalent(User(id=1, name=u'someone'), User(id=2, name=u'someone'))
def test_returns_true_when_properties_match(self, User): assert naturally_equivalent(User(name=u'someone'), User(name=u'someone'))