使用多个数据库和多个应用程序进行Django迁移
我有一个django项目,它有两个应用程序,每个应用程序运行在不同的DB上(让我们称它们为default和DB2)。 我已经创建了一个路由器来管理数据,并将路由器添加到我的使用多个数据库和多个应用程序进行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
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
- 在
命令中定义数据库不是一个选项,因为我在几十台服务器上运行一个CI进程,并且不能在所有服务器上手动运行,因此该命令需要保持不带参数manage.py migrate--database=DB2
- 我不想在迁移中使用任何原始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()
...
...