Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在第二个数据库上运行Python迁移_Django_Django Migrations - Fatal编程技术网

Django 在第二个数据库上运行Python迁移

Django 在第二个数据库上运行Python迁移,django,django-migrations,Django,Django Migrations,在第二个数据库上使用RunPython运行数据库迁移失败 python3 manage.py migrate --database=app 问题是apps.get_model方法使用的是默认数据库,该数据库已经有了最新的迁移 不起作用: def copy_cpr_cents_to_euros(apps, schema_editor): User = apps.get_model('accounting', 'User') User.objects.filter(...); d

在第二个数据库上使用RunPython运行数据库迁移失败

python3 manage.py migrate --database=app
问题是apps.get_model方法使用的是默认数据库,该数据库已经有了最新的迁移

不起作用:

def copy_cpr_cents_to_euros(apps, schema_editor):
    User = apps.get_model('accounting', 'User')
    User.objects.filter(...);
def copy_cpr_cents_to_euros(apps, schema_editor):
    User = apps.get_model('accounting', 'User')
    User.objects.using('app').filter(...);
有效:

def copy_cpr_cents_to_euros(apps, schema_editor):
    User = apps.get_model('accounting', 'User')
    User.objects.filter(...);
def copy_cpr_cents_to_euros(apps, schema_editor):
    User = apps.get_model('accounting', 'User')
    User.objects.using('app').filter(...);
有没有一种方法可以在迁移中使用给定的数据库,所以在本例中是“app”,而不进行明确的声明,因为它应该适用于两个数据库

比如:

User.objects.using(database_name).filter(...)
包含启动迁移的当前数据库的字符串

因此,每次RunPython迁移都必须使用此别名手动选择正确的数据库

例如:

def copy_cpr_cents_to_euros(apps, schema_editor):
    User = apps.get_model('accounting', 'User')
    db = schema_editor.connection.alias
    User.objects.using('app').using(db).filter(...)

可用于运行Python函数的修饰符,用于指定应针对其执行DB的修饰符[在Django 1.8上测试]

def only_default_db_migration(func):
    return only_databases_migration('default')(func)


def only_databases_migration(*db_aliases):
    """Restrict running Data Migrations on wanted databases only"""
    def decorate(func):
        def run_python_func(apps, schema_editor):
            db_alias = schema_editor.connection.alias
            if db_alias in db_aliases:
                return func(apps, schema_editor)
            else:
                print(f'Skip RunPython {func.__name__!r} for db with alias {db_alias!r}')
        return run_python_func
    return decorate

使用
仅\u默认\u数据库\u迁移


@only_default_db_migration
def migrate_spam_check_processed_at(apps, schema_editor):
    apps.get_model("queues","Queue").objects.all().update(check=F('created'))


class Migration(migrations.Migration):

    operations = [
        migrations.RunPython(migrate_spam_check_processed_at),
    ]