5

我下Django框架建设一个网站,这个网站需要有不同的SQL计划django_migrations表,现在我成功创建的所有计划和所有的东西,但我不明白为什么表django_migrations在数据库迁移后的每个模式中。为什么在所有数据库中

  • 预计数据库中的内容:

    AppDB表是

    此应用

    默认的数据库表都是Django的表中定义的所有车型(管理员,CONTENTTYPES,身份验证,会话)

  • 数据库内容:

    AppDB表是所有通过这个程序定义+模型django_migrations

    DEFAULT表所有Django的表(管理员,CONTENTTYPES,AUTH,会话)+ 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 

谢谢。

回答

0

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

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

+0

我认为你不明白我的要求,我的问题是这样的, 我有2分贝,一个应该包括django信息,另一个应该只包括我的应用程序的数据。 当我迁移项目时,它在两个数据库中创建django_migrations表,使用相同的数据,我尽量避免这种情况,但没有帮助我 –

+0

@NadirAlbajari:这是不可能的。您提到的其他表格只是可选应用程序,可以放在任何地方。迁移表不是可选的,它必须存在于每个数据库上,以便它可以跟踪在该数据库上应用了哪些迁移。 –

+0

谢谢@Kevin,我明白这一点,但假设我有2个应用程序(app1,app2)和2个数据库(db1,db2),我想要在db1中为app1进行相关迁移,而在db2中为app2执行相同的迁移。但是db1中的迁移表包含2个应用程序的迁移,而对于db2则包含迁移。 为什么发生这种情况有一个很好的理由吗?有什么办法可以将2个应用程序的迁移分开吗? 再次感谢! –

0

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

在早期版本中,开发人员使用django_south_migration应用了整整这样做,但因为几乎每个人都在使用它,Django的包括在1.7版本起。

现在来到您的问题,django_migrations表保留了数据库模式中应用于数据库的更改记录。该表帮助django应用 python manage.py makemigrations之后创建的新迁移。到该迁移应用此表中的记录的应用程序的名称的

应用柱。如果你会去任何Django应用程序的迁移目录,你会看到以下形式的迁移文件0001_auto的.py等
例如,如果这种移植已经应用到数据库中,你会发现与名称= 0001_auto及应用条目=在django_migrations表中。

+0

我认为你不明白我的要求,我的问题是这样的, 我有2分贝,一个应该包括django信息,另一个应该只包括我的应用程序的数据。 当我迁移项目时,它在两个数据库中创建django_migrations表,使用相同的数据,我尽量避免这种情况,但没有任何帮助 –

相关问题