Manas Chaturvedi
Manas Chaturvedi

Reputation: 5540

Django on Heroku: relation does not exist

I built a Django 1.9 project locally with sqlite3 as my default database. I have an application named Download which defines the DownloadedSongs table in models.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

Now, in order to deploy my local project to Heroku, I added the following lines at the bottom of my settings.py file:

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

My application has a form with a couple of text fields, and on submitting that form, the data gets inserted into the DownloadedSongs table. Now, when I deployed my project on Heroku and tried submitting this form, I got the following error:

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

This is how my requirements.txt file looks like:

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

Also, I did try to run the following commands as well:

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

However, the issue still persists. What seems to be wrong here?

Upvotes: 15

Views: 12339

Answers (5)

THUNDER 07
THUNDER 07

Reputation: 559

python manage.py makemigrations
python manage.py migrate
python manage.py migrate --run-syncdb

this worked for me.

Upvotes: 1

Davy
Davy

Reputation: 1786

Make sure your local migration folder and content is under git version control.

If not, add, commit & push them as follows (assuming you have a migrations folder under <myapp>, and your git remote is called 'heroku'):

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

Wait until the push is successful and you get the local prompt back.

Then log in to heroku and there execute migrate. To do this in one execution environment, do not launch these as individual heroku commands, but launch a bash shell and execute both commands in there: (do not type the '~$', this represents the Heroku prompt)

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

Upvotes: 15

totooooo
totooooo

Reputation: 1405

I know this is old, but I had this issue and found this thread useful.

To sum up, the error can also appear when executing the migrations (which is supposed to create the needed relations in the DB), because recent versions of Django check your urls.py before doing the migrations. In my case - and in many others' it seems, loading urls.py meant loading the views, and some views were class-based and had an attribute defined through get_object_or_404:

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

This is what was evaluated before the migrations actually ran, and caused the error. I fixed it by turning my view's attribute as a property:

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

You'll know quite easily if this is the problem you are encountering, as the Traceback will point you towards the problematic view.

Also this problem might not appear in development because you have migrated before creating the view.

Upvotes: 0

Daniel Roseman
Daniel Roseman

Reputation: 599580

You must not run makemigrations via heroku run. You must run it locally, and commit the result to git. Then you can deploy that code and run those generated migrations via heroku run python manage.py migrate.

The reason is that heroku run spins up a new dyno each time, with a new filesystem, so any migrations generated in the first command are lost by the time the second command runs. But in any case, migrations are part of your code, and must be in version control.

Upvotes: 8

A. J. Parr
A. J. Parr

Reputation: 8026

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

So between deploys your entire SQLite database is going to be wiped, you should move onto a dedicated database when you deploy to heroku I think. I know heroku has a free tier for postgres databases which I'd recommend if you just want to test deployment to heroku.

Upvotes: 1

Related Questions