【发布时间】: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