Django queryset更新迁移

时间:2019-10-15 12:26:53

标签: mysql django migration django-queryset

我正在尝试优化迁移,它花费的时间太长,每次尝试运行它大约需要15分钟,因为此表上有很多数据。这是一个旧数据库,其日期如字符串“ 14102019(%d%m%Y)”,并且需要将其转换为DateField。我为两者都创建了一个DateField。

数据库是MySQL。

dtobitodtnasc是需要转换的旧字符串

data_obitodata_nasc是新的DateFields

有效的方法(非常缓慢):

def date_to_datefield(apps, schema_editor):
    Obitos = apps.get_model('core', 'Obitos')

    for obito in Obitos.objects.all():
        if obito.dtnasc and obito.dtnasc != '':
            obito.data_nasc = datetime.strptime(obito.dtnasc, '%d%m%Y')
        if obito.dtobito and obito.dtobito != '':
            obito.data_obito = datetime.strptime(obito.dtobito, '%d%m%Y')
        obito.save()

什么不起作用:

Obitos.objects.update(
    data_nasc=datetime.strptime(F('dtnasc'), '%d%m%Y'),
    data_obito=datetime.strptime(F('dtobito'), '%d%m%Y')
)

什么可行,但我不知道怎么做:

Obitos.objects.raw("""
        UPDATE obitos new,
        (
            SELECT 
                STR_TO_DATE(dtnasc, '%d%m%Y') AS dtnasc,
                STR_TO_DATE(dtobito, '%d%m%Y') AS dtobito,
            FROM obitos
        ) old
        SET new.data_nasc = old.dtnasc
        SET new.data_obtio = old.dtobito
    """)

1 个答案:

答案 0 :(得分:0)

尝试使用bulk_update

def date_to_datefield(apps, schema_editor):
    Obitos = apps.get_model('core', 'Obitos')

    objs = []

    def to_date_object(date_string):
        return datetime.strptime(date_string, '%d%m%Y')

    for obito in Obitos.objects.all():
        updated = False
        if obito.dtnasc:
            obito.data_nasc = to_date_object(obito.dtnasc)
            updated = True
        if obito.dtobito:
            obito.data_obito = to_date_object(obito.dtobito)
            updated = True
        if updated:
            objs.append(obito)

    if objs:
        Obitos.objects.bulk_update(objs, ['data_nasc', 'data_obito'])