为什么所有数据库中都有django_migrations表

时间:2016-04-27 16:01:23

标签: python django configuration database-migration multiple-databases

我正在Django Framework下构建一个网站,这个网站需要有不同的SQL方案,现在我成功创建了所有方案和所有东西,但我不明白为什么表django_migrations在迁移后的每个模式中都是数据库。

  • 预期数据库内容:

      

    AppDB表是此应用程序定义的所有模型

         

    默认数据库表是所有Django表(admin,contenttypes,auth,sessions)

  • 数据库内容:

      

    AppDB表是此app + django_migrations

    定义的所有模型      

    DEFAULT表是所有Django表(admin,contenttypes,auth,sessions)+ django_migrations

这些是2 dbs的路由器:

class DefaultRouter(object):
    APPS = ['auth', 'sessions', 'admin', 'contenttypes']
    DB = 'default'

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.APPS:
            return self.DB
        return None

    def db_for_write(self, model, **hints):

        if model._meta.app_label in self.APPS:
            return self.DB

        return None

    def allow_relation(self, obj1, obj2, **hints):

        if obj1._meta.app_label in self.APPS or obj2._meta.app_label in self.APPS:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):

        if app_label in self.APPS:
            return db == self.DB
        return None


class MyAppDBRouter(object):
    def db_for_read(self, model, **hints):
        return self.check_app_label(model)

    def db_for_write(self, model, **hints):
        return self.check_app_label(model)

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'myapp' or obj2._meta.app_label == 'myapp':
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'myapp':
            return db == 'appdb'
        return None

    @staticmethod
    def check_app_label(model):
        if model._meta.app_label == 'myapp':
            return 'appdb'
        return None

感谢。

3 个答案:

答案 0 :(得分:0)

django_migrations表记录了已在该数据库上应用的迁移。这是Django迁移系统了解数据库当前状态以及需要运行哪些迁移的机制。因此,所有数据库都需要它。

现在,如果你有一个实际上不需要迁移的表 - 比如一个只读数据库 - 那么这可能会导致问题。这是this ticket的主题。

答案 1 :(得分:0)

在Django 1.7版之前,没有django_migrations表。此后,Django正确地包含了用于处理数据库模式相关更改的迁移,即db.models中字段定义,添加或删除字段的更改。

在早期版本中,开发人员使用 django_south_migration 应用程序来完成此操作,但由于几乎每个人都在使用它,因此Django包含在1.7版本之后。

现在回答您的问题,django_migrations表记录了应用于数据库的数据库模式的变化。此表有助于django应用之后创建的新迁移 python manage.py makemigrations

此表的app列记录了应用此迁移的应用程序的名称。如果您将转到任何django应用程序的迁移目录,您将看到 0001_auto .py等形式的迁移文件。
例如,如果此迁移已应用于数据库,您将找到在django_migrations表中名称= 0001_auto和app =的条目。

答案 2 :(得分:0)

当我运行python'manage.py migration --database = whatever'时,我遇到了与您相同的问题,当我检查dbshel​​l时,只能看到一个名为django_migrations ...的表。 做了几次调整使我无处可去,然后我将数据库的名称更改为路由器文件,然后它起作用了!

例如,如果您调用数据库primary_db ...,则应在路由器中使用您在设置文件中注册的名称。参见下面的示例...

DATABASES = {
    'default': {},
    'primary': {
        'NAME': 'primary_db.sqlite3',
        'ENGINE': 'django.db.backends.sqlite3',        
    },
    'secondary': {
        'NAME': 'secondary_db.sqlite3',
        'ENGINE': 'django.db.backends.sqlite3',
    }
}

在您的路由器文件中,使用primary作为名称,而不使用primary_db ...这是我做的错误...希望对您有所帮助