mysql - Django 查询集更新迁移

标签 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
    """)

最佳答案

尝试使用 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'])

关于mysql - Django 查询集更新迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58394689/

相关文章:

java - 如何在 Java 中使用指针和内存分配实现算法

node.js - Sequelize 唯一约束错误: Validation error

mysql - 按 X 天的范围分组

django - Django 中的 ModelForms,其中底层模型依赖于另一个模型(通过 OneToOneField)

python - 与外部 API 交互的基本电影数据库

azure - FluentMigrator 从 Application_Start 迁移

python - sqlalchemy 中是否有一种解决方法可以在没有任何主键的情况下从数据库加载表?

php - 确定 $_POST ["X"] 是否为空

c# - 600K 记录的数据库或平面文件?

django - 在django中将除表单数据之外的数据添加到数据库中