【问题标题】:Django duplicate migrations in appsDjango 在应用程序中重复迁移
【发布时间】:2020-07-03 18:10:30
【问题描述】:

Django 不断为我的应用程序进行重复迁移。在更改模型之前,我已经运行了 makemigrationsmigrate。更改后我再次运行makemigrations 为更新的模型进行迁移,我收到以下错误:

CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0001_initial, 0001_initial 3 in sessions; 0002_remove_content_type_name 3, 0002_remove_content_type_name, 0001_initial 3 in contenttypes; 0002_alter_permission_name_max_length 3, 0010_alter_group_name_max_length 3, 0007_alter_validators_add_error_messages 3, 0006_require_contenttypes_0002 3, 0005_alter_user_last_login_null 3, 0001_initial 3, 0008_alter_user_username_max_length 3, 0009_alter_user_last_name_max_length 3, 0011_update_proxy_permissions, 0011_update_proxy_permissions 3, 0004_alter_user_username_opts 3, 0003_alter_user_email_max_length 3 in auth; 0003_logentry_add_action_flag_choices 3, 0002_logentry_remove_auto_add 3, 0003_logentry_add_action_flag_choices, 0001_initial 3 in admin).

要修复它们,请运行“python manage.py makemigrations --merge”

运行makemigrations --merge 不起作用:ValueError: Could not find common ancestor of {'0002_remove_content_type_name', '0002_remove_content_type_name 3', '0001_initial 3'}

在我没有接触过的应用程序中有很多重复的迁移(auth、admin 等):

admin
 [ ] 0001_initial 3
 [X] 0001_initial
 [ ] 0002_logentry_remove_auto_add 3
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
 [ ] 0003_logentry_add_action_flag_choices 3
auth
 [ ] 0001_initial 3
 [X] 0001_initial
 [ ] 0002_alter_permission_name_max_length 3
 [X] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length 3
 [X] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts 3
 [X] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null 3
 [X] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002 3
 [X] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages 3
 [X] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length 3
 [X] 0008_alter_user_username_max_length
 [ ] 0009_alter_user_last_name_max_length 3
 [X] 0009_alter_user_last_name_max_length
 [ ] 0010_alter_group_name_max_length 3
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [ ] 0011_update_proxy_permissions 3
contenttypes
 [ ] 0001_initial 3
 [X] 0001_initial
 [X] 0002_remove_content_type_name
 [ ] 0002_remove_content_type_name 3
database
 (no migrations)
sessions
 [X] 0001_initial
 [ ] 0001_initial 3

据我所知,唯一应该受到影响的应用是database。为什么 Django 会进行这些重复的迁移?有什么办法可以摆脱这些吗?或者应用它们以便它们不再阻塞?我如何确保不再发生这种情况?

【问题讨论】:

  • Django 不会“进行重复迁移”,它当然不会在迁移文件名中使用空格,所以问题的原因在你这边。鉴于症状和文件名,我强烈怀疑这些确实是简单的重复文件 - 您可以通过比较这些文件的内容轻松地自行检查,不是吗?如果是这样,解决方法很简单:只需删除那些重复的文件...
  • 我找到了他们,他们住在我的环境中。我想我可以删除它并创建一个新环境以重置整个事物。
  • 你可以直接从你的环境中删除文件——它是一个本地副本,你可以用它做任何你想做的事情。或者从您的环境中卸载/重新安装 Django。
  • 谢谢。仍然不知道副本来自哪里,但现在已修复,将关闭问题。
  • 嗯,知道这些文件来自哪里以防止问题再次发生确实很有趣,但很可能这是一次不可重现的事故......

标签: python django django-migrations


【解决方案1】:

有时,如果您可以选择,最简单、最快的方法是……

  • 删除迁移文件。
  • 删除整个数据库。
  • 再次运行“python manage.py makemigrations”
  • 再次运行“python manage.py migrate”

或者...如果您在生产环境中有一个带有数据的数据库并且您无法重置:

  • 检查最后的生产版本
  • 删除迁移文件(直到此版本)。
  • 删除整个本地(sqlite)数据库。
  • 再次运行“python manage.py makemigrations”
  • 再次运行“python manage.py migrate”

重要...如果需要,将 /migrations/ 文件夹复制到某处以恢复文件。

【讨论】:

  • 我也是这么想的,但是如何删除像 authsession 这样的应用程序的迁移?他们住在我的环境中的某个地方?
  • 删除环境:rmvirtualenv....,然后重新创建它。 ;)
【解决方案2】:

原来这些副本不是由 Django 创建的,而是由其他进程创建的。完全删除我的环境并重新安装所有依赖项有所帮助。删除迁移也可以。

【讨论】:

    【解决方案3】:

    就我而言,问题出在这里:

    class BaseImageField(models.ImageField):
        attr_class = BaseImageFieldFile
    
        def __init__(self, *args, **kwargs):
            kwargs.setdefault('validators', [])
            kwargs['validators'].append(image_validator)    <----------------------------
            super().__init__(*args, **kwargs)
    

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2016-04-14
      • 1970-01-01
      • 2013-06-23
      • 2018-10-19
      • 2019-01-28
      • 1970-01-01
      • 2017-12-31
      • 2015-08-19
      相关资源
      最近更新 更多