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
我们已经解决了如下问题:
- 我们恢复到迁移 0006* - 这是最后一次迁移在其他应用程序中用作依赖项的迁移
- 我们删除了0006以上的所有迁移文件*
- 我们创建了一个新的迁移文件,其中包含所有更改。
- 我们部署到生产服务器
这个过程解决了问题。
现在关于问题的原因,有两个主要原因(正如 Adam Barnes 在原文 post 下面的评论中所指出的)
- 我们在本地和生产之间使用了不同的数据库。
- 我们没有为此项目使用 Local-Staging-Production 设置。
我已建议我的经理尽快改变这种情况,因为遵循此处的最佳做法本可以避免出现这种情况。
感谢大家的帮助!
我有一个在本地运行的 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
我们已经解决了如下问题:
- 我们恢复到迁移 0006* - 这是最后一次迁移在其他应用程序中用作依赖项的迁移
- 我们删除了0006以上的所有迁移文件*
- 我们创建了一个新的迁移文件,其中包含所有更改。
- 我们部署到生产服务器
这个过程解决了问题。
现在关于问题的原因,有两个主要原因(正如 Adam Barnes 在原文 post 下面的评论中所指出的)
- 我们在本地和生产之间使用了不同的数据库。
- 我们没有为此项目使用 Local-Staging-Production 设置。
我已建议我的经理尽快改变这种情况,因为遵循此处的最佳做法本可以避免出现这种情况。
感谢大家的帮助!