贾戈论英雄:关系不存在

2024-04-27 00:13:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

模型.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

然而,这个问题仍然存在。这里好像怎么了?


Tags: 项目djangonamepyimportself应用程序url
3条回答

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

如果没有,请按如下方式添加、提交和推送它们(假设您在<;myapp>;下有一个migrations文件夹,并且您的git remote名为“heroku”):

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

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

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

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

As Heroku's dynos don't have a filesystem that persists across deploys, a file-based database like SQLite3 isn't going to be suitable. It's a great DB for development/quick prototypes, though. https://stackoverflow.com/a/31395988/784648

所以在部署期间,您的整个SQLite数据库都将被清除,我认为在部署到heroku时,您应该迁移到一个专用数据库。我知道heroku有一个免费的postgres数据库层,如果你只是想测试部署到heroku的话,我建议你使用这个层。

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

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

相关问题 更多 >