我正在尝试优化迁移,它花费的时间太长,每次尝试运行它大约需要 15 分钟,因为这个表上有很多数据。这是一个旧数据库,具有像这样的 '14102019' (%d%m%Y) 作为字符串的日期,并且需要将它们转换为 DateField。我为两者创建了一个 DateField。
数据库是MySQL。
dtobito
和dtnasc
是需要转换的旧字符串
data_obito
和 data_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/