【问题标题】:Django on Heroku: relation does not existHeroku上的Django:关系不存在
【发布时间】:2016-11-03 05:22:16
【问题描述】:

我在本地构建了一个 Django 1.9 项目,并使用 sqlite3 作为我的默认数据库。我有一个名为Download 的应用程序,它定义了models.py 中的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

现在,为了将我的本地项目部署到 Heroku,我在 settings.py 文件的底部添加了以下几行:

import dj_database_url
DATABASES['default'] =  dj_database_url.config()

我的应用程序有一个带有几个文本字段的表单,在提交该表单时,数据被插入到DownloadedSongs 表中。现在,当我在 Heroku 上部署我的项目并尝试提交此表单时,我收到以下错误:

Exception Type: ProgrammingError at /download/
Exception Value: relation "Download_downloadedsongs" does not exist
LINE 1: INSERT INTO "Download_downloadedsongs" ("song_name", "song_a...

这就是我的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

但是,问题仍然存在。这里似乎有什么问题?

【问题讨论】:

  • 您可以访问数据库以查看表的名称吗?可能是因为表格都是小写的吗?还是你还需要运行syncdb命令?
  • syndb 命令在 Django 1.9 中已弃用。不过,我确实确保我运行了 makemigrations 命令。

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


【解决方案1】:

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

如果没有,请按如下方式添加、提交和推送它们(假设您在 下有一个迁移文件夹,并且您的 git 远程称为“heroku”):

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

等待推送成功并返回本地提示。

然后登录heroku并在那里执行迁移。 要在一个执行环境中执行此操作,请不要将这些作为单独的 heroku 命令启动,而是启动一个 bash shell 并在其中执行这两个命令:(不要输入“~$”,这代表 Heroku 提示符)

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

【讨论】:

  • 对于我在测试中遇到的问题,我需要登录到 shell 来进行迁移。我做了上面的步骤,但我没有使用“./manage.py”,而是使用了“python manage.py”(使用./给了我一个权限错误)。谢谢。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    由于 Heroku 的 dynos 没有跨部署持续存在的文件系统,因此像 SQLite3 这样的基于文件的数据库将不适合。不过,它是用于开发/快速原型的出色数据库。 https://stackoverflow.com/a/31395988/784648

    因此,在部署期间,您的整个 SQLite 数据库将被擦除,我认为,当您部署到 heroku 时,您应该转移到专用数据库。我知道 heroku 有一个免费的 postgres 数据库层,如果你只是想测试部署到 heroku,我会推荐它。

    【讨论】:

      【解决方案4】:

      我知道这是旧的,但我遇到了这个问题,发现 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')
      

      您会很容易知道这是否是您遇到的问题,因为 Traceback 会将您指向有问题的视图。

      此外,此问题可能不会出现在开发中,因为您在创建视图之前已迁移。

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 1970-01-01
        • 2018-07-16
        • 2019-01-24
        • 2021-03-09
        • 2016-04-11
        • 1970-01-01
        • 2016-06-20
        相关资源
        最近更新 更多