Heroku上的Django:关系不存在

时间:2016-06-30 22:56:07

标签: python django python-2.7 heroku django-models

我在本地构建了一个Django 1.9项目,Download作为我的默认数据库。我有一个名为DownloadedSongs的应用程序,用于定义models.py中的from __future__ import unicode_literals from django.db import models class DownloadedSongs(models.Model): song_name = models.CharField(max_length = 255) song_artist = models.CharField(max_length = 255) def __str__(self): return self.song_name + ' - ' + self.song_artist 表:

models.py

settings.py

现在,为了将我的本地项目部署到Heroku,我在import dj_database_url DATABASES['default'] = dj_database_url.config() 文件的底部添加了以下行:

DownloadedSongs

我的应用程序有一个包含几个文本字段的表单,在提交该表单时,数据会插入到Exception Type: ProgrammingError at /download/ Exception Value: relation "Download_downloadedsongs" does not exist LINE 1: INSERT INTO "Download_downloadedsongs" ("song_name", "song_a... 表中。现在,当我在Heroku上部署我的项目并尝试提交此表单时,我收到以下错误:

requirements.txt

这是我的beautifulsoup4==4.4.1 cssselect==0.9.1 dj-database-url==0.4.1 dj-static==0.0.6 Django==1.9 django-toolbelt==0.0.1 gunicorn==19.6.0 lxml==3.6.0 psycopg2==2.6.1 requests==2.10.0 static3==0.7.0 文件的样子:

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

另外,我也尝试过运行以下命令:

Array.prototype.forEach

然而,问题仍然存在。这里看来有什么不对?

4 个答案:

答案 0 :(得分:6)

确保您的本地迁移文件夹和内容受git版本控制。

如果没有,请添加,提交&按如下方式推送它们(假设您在< myapp>下有一个迁移文件夹,并且您的git遥控器名为'heroku'):

git add <myapp>/migrations/*
git commit -m "Fix Heroku deployment"
git push heroku

等到推送成功后,您会收到本地提示。

然后登录到heroku并执行makemigrations&amp;迁移。 要在一个执行环境中执行此操作,请不要将它们作为单独的heroku命令启动,而是启动一个bash shell并在其中执行这两个命令:(不要键入'〜$',这表示Heroku提示符)

heroku run bash
~$  ./manage.py makemigrations
~$  ./manage.py migrate
~$  exit

答案 1 :(得分:3)

您不得通过heroku run运行makemigrations。您必须在本地运行,并将结果提交给git。然后,您可以部署该代码并通过heroku run python manage.py migrate运行这些生成的迁移。

原因是heroku run每次都使用新的文件系统旋转一个新的dyno,因此第一个命令中生成的任何迁移都会在第二个命令运行时丢失。但无论如何,迁移是代码的一部分,并且必须处于版本控制之中。

答案 2 :(得分:1)

  

由于Heroku的dynos没有跨部署的文件系统,像SQLite3这样的基于文件的数据库不适合。不过,它是开发/快速原型的优秀数据库。 https://stackoverflow.com/a/31395988/784648

因此,在部署之前,您的整个SQLite数据库将被删除,当您部署到heroku时,您应该转移到专用数据库。我知道heroku有一个免费的postgres数据库,如果你只想测试部署到heroku,我建议你这样做。

答案 3 :(得分:0)

我知道这很老了,但是我遇到了这个问题,发现this thread有用。

总而言之,执行迁移时也会出现错误(应该在数据库中创建所需的关系),因为最新版本的Django在进行迁移之前会检查您的urls.py。就我而言-在许多其他情况下,加载urls.py意味着加载视图,并且某些视图是基于类的,并且具有通过get_object_or_404定义的属性:

class CustomView(ParentCustomView):
    phase = get_object_or_404(Phase, code='C')

这是在实际运行迁移并导致错误之前进行的评估。我通过将视图的属性设置为属性来修复它:

class CustomView(ParentCustomView):
    @property
    def phase(self):
        return get_object_or_404(Phase, code='C')

您将很容易知道这是否是您遇到的问题,因为“回溯”会将您引向有问题的视图。

由于您在创建视图之前已进行迁移,因此该问题可能不会出现在开发中。