在Heroku服务器上,Django的makemigrations和migrate命令无法创建表格。

16

Python版本为2.7,Django版本为1.9.7。

我在Heroku上创建了一个Django应用程序。 我无法使Heroku服务器正常地进行“迁移”。过去,我一直在本地完成所有的“makemigrations”,然后将它们推送到服务器上。 这在过去曾经起作用。现在我想选择在服务器端执行所有迁移,因为我根本没有在本地运行此应用程序。

我刚刚在' main '应用程序的 models.py 中创建了一个新模型:

from __future__ import unicode_literals

from django.db import models

class InstagramPhotos(models.Model):
    imageId = models.IntegerField()
    userId = models.IntegerField()
    likes = models.IntegerField()
    captionText = models.CharField(max_length=200)
    image = models.ImageField()
在将更改推送到服务器后,我运行了这个命令,并得到了以下输出:
heroku run python manage.py makemigrations main

在⬢glacial-beach-50253上运行python manage.py makemigrations main... up, run.8354 'main'的迁移:
0001_initial.py: - 创建InstagramPhotos模型

看起来还不错,对吧?然后我尝试执行migrate,如您所知,这将实际在数据库中创建表:

heroku run python manage.py migrate
在 ⬢ glacial-beach-50253 上运行 python manage.py migrate... 执行7556项操作:应用所有迁移:auth、contenttypes、admin、sessions 迁移正在运行:没有可应用的迁移。 你的模型有更改,但尚未反映在迁移中,因此不会应用这些更改。运行'manage.py makemigrations'来创建新的迁移,然后重新运行'manage.py migrate'来应用它们。
无论我试过多少次重新运行makemigrations和migrate,似乎仍然不能识别它。除了无法在Heroku服务器上以这种方式操作外,我不确定为什么会发生这种情况?我一定需要在本地执行makemigrations并推送吗?
FYI,我只定义了默认的sqlite3 DB在settings.py中。

14
不要在Heroku上运行makemigrations。在本地运行,提交结果并推送,然后在Heroku上运行迁移。 - Daniel Roseman
谢谢,我还没有能够做到这一点,因为它会让我在本地进行makemigrations而不更新所有依赖项。我猜测在Django的新版本中,他们需要Pillow,但我还没有安装它,所以我想尝试在安装了依赖项的服务器上完成所有操作,当然没有问题。现在我看到这是行不通的。 - jeffery_the_wind
1
如果您无法在本地运行应用程序,那么您如何进行任何开发呢? - Daniel Roseman
是的,我解决了依赖问题。并不是说我真的做不到,而是我还没有做。从我的角度来看,在服务器上运行迁移似乎是合理的。不确定为什么它仍然不起作用,但没关系。我不在本地服务器上运行它的原因是我正在使用第三方API,该API重定向到公共URL进行身份验证,所以从我的本地机器上无法正常工作。但无论如何,谢谢,我刚刚在本地执行了makemigrations并将其推送。然后迁移在服务器上起作用了。@DanielRoseman - jeffery_the_wind
正确的迁移流程是:本地运行 make migrations + migrate,然后推送/部署迁移至 Heroku。Heroku 可能会在部署时自动迁移(取决于您维护的 Procfile),但如果没有,您可以尝试手动迁移,就像您已经尝试过的那样。但是,这是“快乐路径”,可能会因多种可能原因而结束不好。在这种情况下,请尝试撤消您的更改,本地重复迁移过程(包括部署),然后再次提交您的更改并再次重复迁移流程。在大多数情况下,这将使您回到“快乐路径”。 - Shahar Gino
显示剩余2条评论
5个回答

28

我遇到了类似的问题。

我只需使用以下命令通过ssh连接到heroku dyno: heroku run bash(当然是从你的heroku应用程序文件夹中)

然后如果需要,运行所有迁移和创建超级用户的命令。 对于我来说,可以在sqlite和postgre上工作。


4
自发布后,我已经更好地学会了如何使用Heroku。在Heroku服务器上永远不需要执行makemigrations命令,你应该总是在本地执行makemigrations然后将其推送到服务器,只有在服务器上执行migrate命令即可。 - jeffery_the_wind
谢谢!我没有意识到Heroku命令在每个Dyno中都持久存在。 - Shmuel Kamensky
@Dishant Chavra,你能回答一个非常相似的问题吗?我的代码在推到Heroku后迁移没有进行。 - Ahmed Yasin
嗨,我遇到了类似的问题,但是我无法在本地运行makemigrations,因为我使用的是Heroku Postgres数据库,它显示“用户没有CONNECT权限”。有什么想法可以帮忙吗? - Oliver Hnat
通常这意味着您没有指定数据库名称。 - sam yi
对我也有效。 - Yang

1
我最近遇到了类似的错误,后来发现我错误地将 init.py 文件加入了 git 忽略列表。如果迁移文件夹中没有这些文件,迁移命令就无法找到迁移文件并执行它们。

1
  1. 在本地运行以下命令:
python manage.py makemigrations 
python manage.py migrate
  1. 提交你的代码

  2. 将其推送到Heroku主分支

  3. 运行

heroku run python manage.py makemigrations 
heroku run python manage.py migrate

您的问题现在应该已经解决了。


这些 ,,,, 是什么意思? - Ann Kilzer
翻译:抱歉!请忽略它们。 - anaco ndeda

1

运行makemigrationsmigrate,然后将其推送到远程仓库。


0

在部署到Heroku时,我遇到了两次相同的错误。在列出应用程序目录下的文件时,我发现缺少了必要的django创建SQL表所需的db.sqlite3文件。虽然它会在本地自动创建该文件,但在运行迁移命令时,它不会在heroku上创建。

从这里有两个选项:

  1. 在您的应用程序目录下在heroku上创建db.sqlite3文件
  2. 在本地运行“python manage.py migrate”以创建db.sqlite3并将其推送到heroku repo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接