【问题标题】:Migration of unique value isn't working独特价值的迁移不起作用
【发布时间】:2016-02-24 02:22:18
【问题描述】:

我正在尝试执行迁移,将UUID 字段添加到现有表中。我逐步按照 Django 文档 (https://docs.djangoproject.com/en/1.8/howto/writing-migrations/#migrations-that-add-unique-fields) 中的说明进行了操作,但它对我不起作用。

我正在使用 1.8 版。

模型是这样的:

class Event(models.Model):
    key_public = models.UUIDField(default=uuid.uuid4, unique=True)
    key_private = models.UUIDField(default=uuid.uuid4, unique=True)

我有 3 个迁移文件。 迁移 1:

from __future__ import unicode_literals

from django.db import models, migrations
import uuid

class Migration(migrations.Migration):

    dependencies = [
        ('events', '0007_auto_20151008_1313'),
    ]

    operations = [
        migrations.AddField(
            model_name='Event',
            name='key_private',
            field=models.UUIDField(null=True, default=uuid.uuid4),
        ),

        migrations.AddField(
            model_name='Event',
            name='key_public',
            field=models.UUIDField(null=True, default=uuid.uuid4),
        ),
]

迁移 2:

from __future__ import unicode_literals

from django.db import models, migrations
import uuid


class Migration(migrations.Migration):

    dependencies = [
        ('events', '0008_auto_20151121_1642'),
    ]

    operations = [
        migrations.AlterField(
            model_name='Event',
            name='key_private',
            field=models.UUIDField(default=uuid.uuid4, unique=True),
       ),

       migrations.AlterField(
           model_name='Event',
           name='key_public',
           field=models.UUIDField(default=uuid.uuid4, unique=True),
       ),
    ]

迁移 3:

from __future__ import unicode_literals

from django.db import models, migrations
import uuid

def gen_uuid(apps, schema_editor):
    Event = apps.get_model('events', 'Event')

    for row in Event.objects.all():
        row.key_private = uuid.uuid4()
        row.key_public = uuid.uuid4()

class Migration(migrations.Migration):
    dependencies = [
        ('events', '0009_auto_20151121_1644'),
    ]

    operations = [
        migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
    ]

以下错误:

Traceback (most recent call last):
   File "event/manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
   File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
   File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
   File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
  File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 221, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/migrations/executor.py", line 110, in migrate
self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/migrations/executor.py", line 147, in apply_migration
state = migration.apply(state, schema_editor)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/migrations/migration.py", line 115, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 484, in alter_field
old_db_params, new_db_params, strict)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/sqlite3/schema.py", line 203, in _alter_field
self._remake_table(model, alter_fields=[(old_field, new_field)])
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/sqlite3/schema.py", line 147, in _remake_table
self.quote_name(model._meta.db_table),
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 111, in execute
cursor.execute(sql, params)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/utils.py", line 97, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise
raise value.with_traceback(tb)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
 File "/Users/evandrolg/.virtualenvs/event/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 318, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: events_event__new.key_private

【问题讨论】:

  • 迁移是什么样的?模型是什么样的?
  • 我用更多信息更新了问题。谢谢,@NathanVillaescusa ;)

标签: python django django-models migration


【解决方案1】:

在迁移 #3 中,您需要执行 row.save()。您可能还需要在迁移 #3 之后执行迁移 #2,因为它会更改列以禁止空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2018-12-16
    • 2012-09-08
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多