【问题标题】:Django / postgresql 'column "type_id" cannot be cast automatically to type integer'Django / postgresql 'column "type_id" 不能自动转换为整数类型'
【发布时间】:2018-02-01 10:24:05
【问题描述】:

我有一个在本地运行的 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

本地数据库:sqlite

【问题讨论】:

  • 你的python版本是多少?你能发布 SlugModel
  • 最简单的方法是删除你拥有的迁移文件并再次在服务器中运行迁移,最好不要在生产时使用本地迁移文件
  • 如果已创建,则需要删除数据库并删除除 init.py 之外的所有迁移文件,然后运行 ​​migrate
  • 您应该保留development, staging, and production as similar as possible。您应该在本地使用 postgreSQL,因此您会在部署到生产环境之前发现这些问题(!!!)
  • @Exprator 这完全不正确 - 迁移文件与数据库无关,应保存在版本控制中 - 部署时绝对不会重新生成。建议某人删除他们的生产数据库是非常危险的。如果您不知道自己在做什么,请不要发表评论。 :(

标签: django postgresql django-migrations


【解决方案1】:

我们已经解决了这个问题:

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

这个过程解决了问题。

现在关于问题的原因,有两个主要原因(正如亚当巴恩斯在原帖下方的 cmets 中指出的那样)

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

我已建议我的经理尽快改变这种情况,因为遵循此处的最佳做法可能会阻止整个情况。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2023-03-28
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2022-09-25
    • 2017-10-23
    • 1970-01-01
    • 2013-07-06
    相关资源
    最近更新 更多