【问题标题】:Django postgress - multiple primary keys are not allowed errorDjango postgres - 不允许多个主键错误
【发布时间】:2017-11-05 13:04:21
【问题描述】:

我正在使用 Postgress 数据库的生产系统上运行迁移,运行时出现以下错误:

django.db.utils.ProgrammingError: 不允许表“website_experience”的多个主键

但在我的开发 SQL 数据库上运行良好。这是我正在使用的模型:

class Experience (models.Model):
    title = models.CharField(max_length = 60)
    company = models.CharField(max_length = 60)
    city = models.CharField(max_length = 60)
    start_date = models.DateField(blank=False, default=datetime.now)
    end_date = models.DateField(blank=True, null=True)
    description = models.CharField(max_length = 1000)
    creative_user = ForeignKey(CreativeUserProfile, models.CASCADE)

最初,creative_user 字段(这是我的扩展 User 模型)是一个主键,但将其更改为 ForeignKey 以表示一个 CreativeUser 具有许多工作经验之间的一对多关系。

这是更改 ForeignKey 前后的迁移

class Migration(migrations.Migration):

    dependencies = [
        ('website', '0003_auto_20170510_1436'),
    ]

    operations = [
        migrations.CreateModel(
            name='Experience',
            fields=[
                ('title', models.CharField(max_length=60)),
                ('company', models.CharField(max_length=60)),
                ('city', models.CharField(max_length=60)),
                ('startDate', models.DateField()),
                ('endDate', models.DateField(blank=True, null=True)),
                ('creative_user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='website.CreativeUserProfile')),
            ],
        ),
]

这表示创建体验模型,并且 creative_user 是模型的主键。然后将其设为 ForeignKey 后,迁移看起来像:

class Migration(migrations.Migration):

    dependencies = [
        ('website', '0004_experience'),
    ]

    operations = [
        migrations.AddField(
            model_name='experience',
            name='id',
            field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
            preserve_default=False,
        ),
        migrations.AlterField(
            model_name='experience',
            name='creative_user',
            field =models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='website.CreativeUserProfile'),
    ),
]

正如我所说,这一切都适用于开发,但在 Postgress DB 上迁移认为我有多个主键。谁能指出我做错了什么?

谢谢。

【问题讨论】:

    标签: django-models django-database


    【解决方案1】:

    可能是与迁移更改顺序有关的问题。我的迁移文件中有这个:

    operations = [
        migrations.AddField(
            model_name='unsubscriber',
            name='id',
            field=models.AutoField(default=None, primary_key=True, serialize=False),
            preserve_default=False,
        ),
        migrations.AlterField(
            model_name='unsubscriber',
            name='phone',
            field=models.IntegerField(verbose_name='Teléfono'),
        ),
    ]
    

    在示例中,我想将 primary_key 从 phone 更改为名为 id 的新字段,如您所见,此迁移尝试将新字段创建为 PK 而不更改旧字段。

    只需将顺序更改为此必须有效:

    operations = [
    
            migrations.AlterField(
                model_name='unsubscriber',
                name='phone',
                field=models.IntegerField(verbose_name='Teléfono'),
            ),
            migrations.AddField(
                model_name='unsubscriber',
                name='id',
                field=models.AutoField(default=None, primary_key=True, serialize=False),
                preserve_default=False,
            ),
        ]
    

    它解决了问题。 希望对你有帮助。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,并设法通过从创建受影响的表的位置删除所有迁移文件来解决它,然后运行 ​​makemigrations 并迁移。

      您的迁移文件“0004_experience”创建了一个名为“creative_user”的 oneToOneField,它被设置为主键。 我的猜测是,从 onToOne 更改为 oneToMany 关系需要在以后的迁移中创建一个新的唯一字段(自动递增字段“id”并将其设置为主键),因为“creative_user”不再是唯一的。

      由于最新的迁移依赖于之前的迁移,因此您最终得到了两个主键。 删除这些有冲突的迁移文件会让你解决问题。

      【讨论】:

        【解决方案3】:

        我已经删除了除了 init.py 之外的所有迁移文件并再次运行迁移命令。

        python manage.py makemigrations
        python manage.py migrate appName
        

        解决了我的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-21
          • 2011-06-28
          • 1970-01-01
          • 2013-12-29
          相关资源
          最近更新 更多