Opened 7 years ago
Last modified 7 years ago
#30431 closed Bug
Migration hangs on non default database — at Version 2
| Reported by: | mandm | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | dev |
| Severity: | Normal | Keywords: | migrations, uuid, uuidfield, database router, multiple database |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
I'm trying to add a UUIDField in an existing user model following this method (with unique=True & default=uuid.uuid4). https://docs.djangoproject.com/en/1.11/howto/writing-migrations/#migrations-that-add-unique-fields
This works with a single database but hangs in the following scenarios with multiple databases :
- Hangs
- python manage.py migrate --database=nondefault
- also hangs with
.using('nondefault')in the query in gen_uuid function
- Works
- python manage.py migrate
- python manage.py migrate --database=default
It seems to always hang at this statement UserModel.objects.all() when a non-default database is used either via --database option in migrate or via .using('nondefault') in query.
Here's a snippet of the code I've used. I would be glad to provide additional information to reproduce the issue.
User model :
class CustomUser(AbstractUser):
address = models.TextField()
uniq_id = models.UUIDField(unique=True, default=uuid.uuid4)
class Meta:
db_table = 'customuser'
Migration file
def gen_uuid(apps, schema_editor):
UserModel = apps.get_model('myapp', 'customuser')
for row in UserModel.objects.all(): # .objects.using('foobar').all(): -- HANGS !
row.uniq_id = uuid.uuid4()
row.save(update_fields=['uniq_id']) # .save(using='foobar', ...) -- HANGS with database routers !
class Migration(migrations.Migration):
dependencies = [
('myapp', '003_previous_migration'),
]
operations = [
migrations.AddField(
model_name='customuser',
name='uniq_id',
field=models.UUIDField(default=uuid.uuid4, null=True),
),
migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
migrations.AlterField(
model_name='customuser',
name='uniq_id',
field=models.UUIDField(default=uuid.uuid4, unique=True),
),
]
Change History (2)
comment:1 by , 7 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 7 years ago
| Description: | modified (diff) |
|---|---|
| Summary: | Migration hangs when using UUIDField with unique default value & multiple databases → Migration hangs on non default database |