django.db.utils.IntegrityError:无法创建唯一索引-详细信息:键(播放器)=(Lonergan)重复。-模型中无唯一约束

django.db.utils.IntegrityError:无法创建唯一索引-详细信息:键(播放器)=(Lonergan)重复。-模型中无唯一约束,django,postgresql,django-models,migration,Django,Postgresql,Django Models,Migration,在几次离线提交(包括几次更新模型和部署到生产环境)之后,错误消息是:(它正在进行开发,但在生产环境中失败) 这是超过100名球员在表中有一个重复的名字和外地球员从来没有被设置为唯一的。为什么会这样 class Player(models.Model): player = models.CharField(max_length=50) team = models.ForeignKey(Team, related_name='players', on_delete=models.PR

在几次离线提交(包括几次更新模型和部署到生产环境)之后,错误消息是:(它正在进行开发,但在生产环境中失败)

这是超过100名球员在表中有一个重复的名字和外地球员从来没有被设置为唯一的。为什么会这样

class Player(models.Model):
    player = models.CharField(max_length=50)
    team = models.ForeignKey(Team, related_name='players', on_delete=models.PROTECT)
    position = models.CharField(max_length=5)
    cost = models.FloatField()
    selection = models.FloatField()
    form = models.FloatField()
    points = models.IntegerField()
    lastgwscrape = models.DateTimeField(null=True)
    lastapiupdate = models.DateTimeField(null=True)
    currentgwdt = models.DateTimeField(null=True)
    apiid = models.IntegerField(null=True)
APID字段以前定义为唯一字段,并作为测试将其删除,以使此迁移工作正常

class APIPlayerGW(models.Model):
    player = models.ForeignKey(Player, related_name='apigws', on_delete=models.CASCADE)
    gwid = models.IntegerField()
    points = models.IntegerField()
    minutesplayed = models.IntegerField()
    goalsscored = models.IntegerField()
    assists = models.IntegerField()
    cleansheets = models.IntegerField()
    goalsconceded = models.IntegerField()
    owngoals = models.IntegerField()
    penaltiessaved = models.IntegerField()
    penaltiesmissed = models.IntegerField()
    yellowcards = models.IntegerField()
    redcards = models.IntegerField()
    saves = models.IntegerField()
    bonuspoints = models.IntegerField()
    bonuspointsystem = models.IntegerField()
    influence = models.FloatField()
    creativity = models.FloatField()
    threat = models.FloatField()
    ictindex = models.FloatField()
    datetime = models.DateTimeField(default=timezone.now)
    season = models.CharField(max_length=10)

    # class Meta:
    #     unique_together = ('player','gwid','season') # Double gameweeks are lumped together

上表中有一个独特的组合,该组合被注释为使此迁移工作的测试。我该怎么做才能使这个迁移工作正常?

尝试在
unique>中同时使用
player\u id
而不是
player
,因为它是一个
外键
,所以只使用id更有意义。如果仍然不起作用,那么理想情况下,两个玩家的ID是相同的。

迁移文件与迁移不同步,Django试图使用旧的迁移文件@阿卜杜勒·阿齐兹·巴卡特的评论让我走上了正确的方向。可以通过以下步骤重置Django迁移来解决此问题:

  • 脱机注释掉Models.py中的所有更改,以反映生产数据库的状态
  • 投入生产
  • python manage.py migrate——假应用程序名称为零
  • 导航到生产应用程序中的“迁移”文件夹,并使用
    find删除旧的迁移文件-路径“*.py”-非-name“\uuuu init\uuuu.py”-删除
    查找-路径“*.pyc”-删除
  • 创建新的初始迁移
    python manage.py makemigrations
  • 由于数据库表已经存在,请运行
    python manage.py migrate--false initial
  • 我在运行--fake初始标志时收到一条错误消息,但是用--fake标志替换它是可行的:
    python manage.py migrate--fake

    来自您的评论:


    迁移文件与迁移和迁移不同步 Django试图使用旧的迁移文件

    我假设发生了如下情况(或者可能还有其他情况,比如一些迁移文件是手动编辑的,等等):

  • 您的项目处于某种版本控制中
  • 有些人在本地生成迁移并将其推送到版本控制(他们的名字以相同的前缀开头,例如
    0003
    ),不幸的是,没有检测到该前缀,可能以后会在这些迁移的基础上生成更多的迁移
  • 我建议以下三种方法来解决这些问题:

    1.使用
    合并迁移--Merge
    一般来说,解决这种情况的第一件事是尝试使用合并冲突。如果冲突不是很复杂,在大多数情况下,Django将能够使用此命令为您修复冲突

    2.回滚迁移并重新生成它们 您应该尝试的下一个解决方案(而不是直接在生产服务器上进行迁移)是通过回滚到与生产服务器状态一致的某个以前的迁移来修复本地迁移。假设产品正确迁移到
    0005
    ,我们将执行以下操作(在开发服务器上):

  • 迁移回
    0005

     python manage.py migrate <app_label> 0005
    
  • 将这些迁移推送到生产环境并进行迁移

  • 3.手动编辑迁移 如果这些步骤不可行,那么可以尝试亲自编辑迁移文件,通过参考上的文档来解决问题



    注意:虽然您的解决方案(在生产上修复迁移)运行良好,但许多人不允许这样做,如果我们有多台生产服务器,这也可能会导致以后出现问题,因为在这种情况下,它们之间的迁移可能不一致。

    您所说的“此迁移”是什么意思?您在这次迁移中做了哪些更改?请将迁移文件中不起作用的内容添加到您的问题中。@AbdulAzizBarkat我查看了django_迁移表,发现它是多个尚未执行的迁移。。。。据我所知,他们中没有一个对播放器型号进行了更改。在你的应用程序中会有一个目录
    migrations
    ,其中会有像
    0001
    0002
    。。。。显示失败迁移的内容。@AbdulAzizBarkat如果你想得到赏金,请在下面写一个简单的答案。这种重置就像用大锤钉钉子一样,它不会告诉你如何进入这种情况,这意味着很可能再次发生。迁移是Django应用程序不可分割的一部分,必须了解它们的工作原理、错误可能是什么以及如何正确诊断它们。@Melvyn我明白你的意思。我陷入这种情况是因为迁移文件是在本地和生产环境中生成的。如果迁移文件只在本地生成并推送到生产环境中,那么这种情况就不会发生。我不知道Abdul Aziz Barkat建议的--merge标志,我将进一步介绍如何将迁移文件从本地推送到生产环境。因此,这意味着,当其他人推到主线,并且您的功能分支也在同一个应用程序中进行迁移时,同样的情况也会发生。这很常见,可以通过
    merge
    或重新调整依赖项来解决。我通常会重新调整依赖项,因为从长远来看,合并会使其他迁移问题很难诊断(尤其是循环依赖项)。我可以极力推荐。谢谢你的阅读建议。在这种情况下,Github是一个中间存储,所以计划是在生产迁移之前将迁移文件合并到Github
     python manage.py migrate <app_label> 0005
    
     python manage.py makemigrations