Django/postgresql 'column "type_id" cannot be cast automatically to type integer'

Django / postgresql 'column "type_id" cannot be cast automatically to type integer'

我有一个在本地运行的 Django 应用程序,但是当我尝试将其部署到生产环境时失败并出现以下错误:

django.db.utils.ProgrammingError: column "type_id" cannot be cast automatically to type integer
HINT:  You might need to specify "USING type_id::integer".

我的本地设置和生产之间的主要区别是我使用的是 SQLite3 而生产使用的是 postgres

它失败的迁移是迁移 10,看起来像这样。

class Migration(migrations.Migration):

    dependencies = [
        ('speakers', '0009_auto_20180117_1335'),
    ]

    operations = [
        migrations.AlterField(
            model_name='speaker',
            name='type',
            field=models.ForeignKey(to='speakers.Type'),
        ),
    ]

前面的迁移、它的依赖关系和最后的工作迁移如下所示:

class Migration(migrations.Migration):

    dependencies = [
        ('speakers', '0008_auto_20180117_1309'),
    ]

    operations = [
        migrations.CreateModel(
            name='Type',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('name', models.CharField(max_length=200)),
            ],
            options={
                'verbose_name': 'Type',
                'verbose_name_plural': 'Types',
            },
        ),
        migrations.RenameField(
            model_name='speaker',
            old_name='speaker_categories',
            new_name='type',
        ),
    ]

为了制作东西,我还将包括模型(正如他们在最后看到的那样)

class Type(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

    class Meta:
        verbose_name = _("Type")
        verbose_name_plural = _("Types")



class Speaker(models.Model):

    VIDEO_SRC_TYPES = (
        ('yt', 'Youtube'),
        ('vm', 'Vimeo'),
    )

    status = models.CharField(
        max_length=40,
        choices=STATUSES,
        verbose_name=_("Status"),
        default=DEFAULT_STATE)

    type = models.ManyToManyField(Type)

(已删除 'Speaker' 模型中的大部分字段以保持代码简短)

我怀疑问题是由于 SQLite 和 postgres 之间的一些差异造成的,这导致在 SQLITE 上迁移到 运行 并在 postgres 上崩溃。但是我对数据库的细节不是很了解,而且我不知道从这里去哪里。有谁知道发生了什么以及如何解决这个问题?任何帮助将不胜感激,因为我们的团队目前非常困难

规格:

Python:python2.7。 (是的,我知道,但它是一个旧应用程序)

数据库生产:postgres

本地数据库:sqlite

我们已经解决了如下问题:

  1. 我们恢复到迁移 0006* - 这是最后一次迁移在其他应用程序中用作依赖项的迁移
  2. 我们删除了0006以上的所有迁移文件*
  3. 我们创建了一个新的迁移文件,其中包含所有更改。
  4. 我们部署到生产服务器

这个过程解决了问题。

现在关于问题的原因,有两个主要原因(正如 Adam Barnes 在原文 post 下面的评论中所指出的)

  1. 我们在本地和生产之间使用了不同的数据库。
  2. 我们没有为此项目使用 Local-Staging-Production 设置。

我已建议我的经理尽快改变这种情况,因为遵循此处的最佳做法本可以避免出现这种情况。

感谢大家的帮助!