Heroku上的Django:关系不存在

Man*_*edi 8 python django heroku django-models python-2.7

我在本地构建了一个Django 1.9项目sqlite3作为我的默认数据库.我有一个名为的应用程序Download,用于定义DownloadedSongsmodels.py:

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
Run Code Online (Sandbox Code Playgroud)

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

import dj_database_url
DATABASES['default'] =  dj_database_url.config()
Run Code Online (Sandbox Code Playgroud)

我的应用程序有一个包含几个文本字段的表单,在提交该表单时,数据会插入到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...
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

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

heroku run python manage.py makemigrations
heroku run python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

但是,问题仍然存在.这里看起来有什么不对?

Dav*_*avy 8

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

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

git add <myapp>/migrations/*
git commit -m "Fix Heroku deployment"
git push heroku
Run Code Online (Sandbox Code Playgroud)

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

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

heroku run bash
~$  ./manage.py makemigrations
~$  ./manage.py migrate
~$  exit
Run Code Online (Sandbox Code Playgroud)

  • 对于我在测试中遇到的问题,我需要登录到Shell进行迁移。我执行了上述步骤,但没有使用“ ./manage.py”,而是使用了“ python manage.py”(使用./给了我权限错误)。谢谢。 (2认同)

Dan*_*man 7

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

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


A. *_*arr 1

由于 Heroku 的 dynos 没有跨部署持续存在的文件系统,因此像 SQLite3 这样基于文件的数据库并不合适。不过,对于开发/快速原型来说,它是一个很棒的数据库。/sf/answers/2197719191/

因此,在部署之间,您的整个 SQLite 数据库将被擦除,我认为,当您部署到 heroku 时,您应该转移到专用数据库。我知道heroku 有一个针对postgres 数据库的免费套餐,如果您只想测试到heroku 的部署,我建议您使用该套餐。