使用多个数据库和多个应用程序进行Django迁移

使用多个数据库和多个应用程序进行Django迁移,django,django-models,django-migrations,Django,Django Models,Django Migrations,我有一个django项目,它有两个应用程序,每个应用程序运行在不同的DB上(让我们称它们为default和DB2)。 我已经创建了一个路由器来管理数据,并将路由器添加到我的settings.py 当我运行migrate时,我得到Applying analytics.0001\u initial。。。好的但在默认数据库中,唯一更新的是django_migrations表,该表显示应用程序分析已使用0001进行了迁移,而在DB2中,甚至根本没有创建表本身 转到django shell并尝试执行obj

我有一个django项目,它有两个应用程序,每个应用程序运行在不同的DB上(让我们称它们为default和DB2)。 我已经创建了一个路由器来管理数据,并将路由器添加到我的
settings.py

当我运行migrate时,我得到
Applying analytics.0001\u initial。。。好的
但在默认数据库中,唯一更新的是
django_migrations
表,该表显示应用程序分析已使用0001进行了迁移,而在DB2中,甚至根本没有创建表本身

转到django shell并尝试执行
obj.objects.all()
提供的表DB2.table\u名称不存在 我还验证了sql中的DB2是否存在,但没有我创建的任何表

我的路由器:

我的型号:

迁移:

  • DB2存在并且有一个空的
    django_migrations

  • manage.py migrate--database=DB2
    命令中定义数据库不是一个选项,因为我在几十台服务器上运行一个CI进程,并且不能在所有服务器上手动运行,因此该命令需要保持不带参数

  • 我不想在迁移中使用任何原始SQL


我也发现了这一点:但我不知道自2016年以来是否发生了任何变化,也希望找到一种方法让它在没有
数据库
选项的情况下运行,默认情况下
迁移
--数据库
值作为
默认值(
默认值\u DB\u别名
),如果没有提供的话;因此,应用该数据库的所有迁移。如果要使用Django提供的现成功能,必须使用
--database
说明要在哪个数据库上操作。如果由于某种原因,您无法使用该命令(如您所述),您可以创建一个自定义管理命令,例如
migrate\u all
,以将所有迁移一次应用于所有数据库

下面的示例方法仅显示了
句柄
方法的外观,您可以从
迁移
中获得灵感:

migrate_all.py

from importlib import import_module
from django.apps import apps
from django.db import connections

class Command(BaseCommand):
    help = "Updates all database schemas."

    def add_arguments(self, parser):
        # Add arguments if you want
        pass

    def handle(self, *args, **options):
        # Import the 'management' module within each installed app, to register
        # dispatcher events.
        for app_config in apps.get_app_configs():
            if module_has_submodule(app_config.module, "management"):
                import_module('.management', app_config.name)

        # Iterate over and operate on each of the databases
        for connection in connections.databases:
            # https://github.com/django/django/blob/master/django/core/management/commands/migrate.py#L84
            connection.prepare_database()
            ...
            ...
connections.databases
获取每个连接后

class PartnerImpression(models.Model):
    """ used to track impressions on widgets through our partners """
    partner = models.CharField(max_length=1024)
    referer = models.CharField(default="N/A", max_length=2048)
    created = models.DateTimeField(auto_now_add=True, blank=True)

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='PartnerImpression',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('partner', models.CharField(max_length=1024)),
                ('referer', models.CharField(default='N/A', max_length=2048)),
                ('created', models.DateTimeField(auto_now_add=True)),
            ],
        ),
    ]

from importlib import import_module
from django.apps import apps
from django.db import connections

class Command(BaseCommand):
    help = "Updates all database schemas."

    def add_arguments(self, parser):
        # Add arguments if you want
        pass

    def handle(self, *args, **options):
        # Import the 'management' module within each installed app, to register
        # dispatcher events.
        for app_config in apps.get_app_configs():
            if module_has_submodule(app_config.module, "management"):
                import_module('.management', app_config.name)

        # Iterate over and operate on each of the databases
        for connection in connections.databases:
            # https://github.com/django/django/blob/master/django/core/management/commands/migrate.py#L84
            connection.prepare_database()
            ...
            ...