Kilitleme sorunlarından kaçınmak için büyük gruplar halinde tüm satırları daha küçük gruplar halinde değiştirdiğim bir veri geçişi yazmak istiyorum. Ancak, bir Django geçişinde elle nasıl işleneceğini anlayamıyorum. Everytime commit
alıyorum çalıştırmayı deneyin:Django veri geçişinde el ile teslim et
TransactionManagementError: This is forbidden when an 'atomic' block is active.
AFAICT bir atomic block içinde database schema editor always wraps Postgres migrations.
İşlemin içinden geçişi engellemenin aklı başında bir yolu var mı?
taşıma işlemim şöyle görünür:
def modify_data(apps, schema_editor):
counter = 0
BigData = apps.get_model("app", "BigData")
for row in BigData.objects.iterator():
# Modify row [...]
row.save()
# Commit every 1000 rows
counter += 1
if counter % 1000 == 0:
transaction.commit()
transaction.commit()
class Migration(migrations.Migration):
operations = [
migrations.RunPython(modify_data),
]
Django 1.7 ve Postgres 9.3 kullanıyorum. Bu, Django'nun Güney ve eski sürümleriyle çalışırdı. the documentation about RunPython
itibaren
Teşekkürler. Bunu çoktan denedim ama aslında göçün etrafındaki atomik bağlamı ortadan kaldırmıyor (en azından Postgres için). – Pankrat
Meraklı, çünkü django.db.migration.py dosyasındaki kod: 'schema_editor.connection.features.can_rollback_ddl ve operation.atomic: '- eğer değilse schema_editor.connection.features.can_rollback_ddl ve operation.atomic: atomik değil (schema_editor.connection.alias): ... '. Başka bir şey olmadığına olumlu baktın mı? Belki orada bir kırılma noktası koydu (django 1.8'deki çizgi 109)? –
Evet, bu işlem atomik yapmaktan kaçınıyor, ancak veritabanı şema editörü hala tüm taşıma atomunu yapıyor: https://github.com/django/django/blob/stable/1.7.x/django/db/backends/schema.py # L85 – Pankrat