好吧,似乎没有多少人有经验或关心这个非常具体的问题。我在这里和那里尝试了一些东西,我还从南方邮件列表中获得了一些支持,帮助我理解了一些观点。
基本上,我实施的解决方案如下:
我有一个通过 South 的schemamigration自动生成的非常正常的迁移文件。但我已将add_column和delete_column的表名更改为schema.table_name
. 通过导入多租户中间件提供模式。
仅当架构未针对公共架构运行时,才会应用迁移。它实际上并不意味着独立运行,或者仅与数据库和模式 kwargs 一起运行,而是来自一个新的 django 命令的迁移运行器。
不幸的是,跑步者不得不在外部调用迁移,以便每次再次通过中间件。另一个技巧是我们必须获取先前的迁移状态,以便在每次租户迁移后将其伪造回南部的先前状态。
这是我的片段:
from subprocess import call
import os
from django.core.management.base import BaseCommand
from south.models import MigrationHistory
from myapp.models import MyModel
class Command(BaseCommand):
def handle(self, *args, **options):
#the only allowed arg is the prefix version and it should have a length of 4 (i.e. 0002)
applied = MigrationHistory.objects.filter(app_name='myapp').latest('applied')
current_version = applied.migration[:4]
call_args = ['python', os.path.join('bin', 'manage.py'), 'migrate', 'myorderbird.app.backups']
if len(args) == 1 and len(args[0]) == 4:
call_args.append(args[0])
obje_call_args = None
for obje in MyModel.objects.all():
if obje.schema_exists:
# fake the migration of the previous venue back to the current version
if obje_call_args:
obje_call_args = obje_call_args[:4] + [current_version, '--fake'] + obje_call_args[len(obje_call_args)-3:]
call(obje_call_args)
# migrate the venue in the loop
obje_call_args = list(call_args)
obje_call_args.extend(['--database={}'.format(obje.db), '--schema={}'.format(obje.schema)])
call(venue_call_args)