Esempio n. 1
0
    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)
Esempio n. 2
0
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)
Esempio n. 3
0
        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: