def test_multidb(self): path = join(mig_root, 'multidb') results = dict(get_all_migrations(path)) self.assertEquals(len(results), 2) self.assertTrue('default' in results) self.assertTrue('other' in results) default = results['default'] self.assertEquals(len(default), 2) self.assertTrue((1, join(path, 'default', '0001.sql')) in default) self.assertTrue((2, join(path, 'default', '0002_foo.py')) in default) other = results['other'] self.assertEquals(len(other), 2) self.assertTrue((1, join(path, 'other', '0001.sql')) in other) self.assertTrue((2, join(path, 'other', '0002_bar.sql')) in other)
def get_pending_migrations(path, databases=None, stop_at=None): """ Returns a dictionary of database => [migrations] representing all pending migrations. """ if stop_at is None: stop_at = float("inf") # database: [(number, full_path)] possible_migrations = get_all_migrations(path, databases) # database: [full_path] applied_migrations = get_applied_migrations(databases) # database: [full_path] to_execute = defaultdict(list) for database, scripts in possible_migrations.iteritems(): applied = applied_migrations[database] pending = to_execute[database] for number, migration in scripts: path, script = os.path.split(migration) if script not in applied and number <= stop_at: pending.append(script) return dict((k, v) for k, v in to_execute.iteritems() if v)
connection.settings_dict["NAME"] = test_db_name try: applied_migrations = get_applied_migrations(databases=[alias]) except Exception, e: # assume db does not exist print >> sys.stderr, "---> Hit an error getting applied migrations:" print >> sys.stderr, "--->", e return False finally: # We MUST change the database name back otherwise when we attempt to migrate later # theres a good chance it will become something like "test_test_FOO" connection.close() connection.settings_dict["NAME"] = original_db_name for db, migrations in get_all_migrations(migration_root, databases=[alias]).iteritems(): migrations = set(m[1].rsplit('/', 1)[-1] for m in migrations) for migration in applied_migrations.get(db, []): if migration not in migrations: print >> sys.stderr, "---> Cannot migrate database %r because %r was not found on disk." % (db, migration) return False return True def _setup_db(self, connection, alias): # We only need to setup databases if migrations dont match: can_migrate = self._can_migrate(connection, alias) if can_migrate: original_db_name = connection.settings_dict["NAME"] try: