Django / postgresql'列" type_id"无法自动投射以输入整数'

时间:2018-02-01 10:24:06

标签: django postgresql django-migrations

我有一个在本地工作的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)

(#'扬声器'模型中的大多数字段已被移除以保持代码简短)

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

规格:

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

数据库制作:postgres

DB local:sqlite

1 个答案:

答案 0 :(得分:0)

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

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

    现在关于问题的原因,有两个主要原因(正如Adam Barnes在原帖中的评论中指出的那样)

    1. 我们在本地和制作之间使用了不同的数据库。
    2. 我们没有为此项目使用Local-Staging-Production设置。
    3. 我已经建议我的经理尽快改变这种情况,因为这里的最佳做法可以防止这种情况发生。

      感谢大家的帮助!