Deploying Django to Heroku (Psycopg2 Error) Deploying Django to Heroku (Psycopg2 Error) postgresql postgresql

Deploying Django to Heroku (Psycopg2 Error)


EDITED:

As @mipadi has pointed out here (http://stackoverflow.com/questions/13001031/django-heroku-settings-injection/13092534), it can actually be as simple as this:

import dj_database_urlDATABASES = {'default' : dj_database_url.config() }

This works if you have a DATABASE_URL env variable set. heroku:pg_promote gets your there. Details below


Make sure you have Postgres on your Heroku

heroku addons:add heroku-postgresql:dev

Step 1: figure out your database url

heroku config | grep POSTGRESQL

The output will look something like this:

HEROKU_POSTGRESQL__URL: postgres://user:password@host:5432/blabla

Step 2: Grab the setting name from the previous step (e.g. HEROKU_POSTGRESQL_ROSE_URL) and put it in your settings file like so

DATABASES = {'default': dj_database_url.config(default=os.environ["HEROKU_POSTGRESQL_ROSE_URL"])}

[UPDATE] As Ted has pointed out, there's a way to promote the color URL to DATABASE_URL variable:

heroku pg:promote HEROKU_POSTGRESQL_ROSE_URL

Your database settings can then use DATABASE_URL as opposed to more exotic colored URLS

DATABASES = {'default': dj_database_url.config(default=os.environ["DATABASE_URL"])}

Bob is your uncle


I got it working by adding the following code to settings.py myself, seems for some reason Heroku didn't add it for me....

Normally it always added the code on Heroku dynamically but I guess after django 1.4 it didnt do it anymore for some reason. Or I was just doing something wrong.

Anyway this is the code just append it to your settings.py and it should work as before.

import sysimport urlparseimport os# Register database schemes in URLs.urlparse.uses_netloc.append('postgres')urlparse.uses_netloc.append('mysql')try:    # Check to make sure DATABASES is set in settings.py file.    # If not default to {}    if 'DATABASES' not in locals():        DATABASES = {}    if 'DATABASE_URL' in os.environ:        url = urlparse.urlparse(os.environ['DATABASE_URL'])        # Ensure default database exists.        DATABASES['default'] = DATABASES.get('default', {})        # Update with environment configuration.        DATABASES['default'].update({            'NAME': url.path[1:],            'USER': url.username,            'PASSWORD': url.password,            'HOST': url.hostname,            'PORT': url.port,        })        if url.scheme == 'postgres':            DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'        if url.scheme == 'mysql':            DATABASES['default']['ENGINE'] = 'django.db.backends.mysql'except Exception:    print 'Unexpected error:', sys.exc_info()


My app structure was off... heroku wants the structure to look like this:

toplevel  requirements.txt  myapp    manage.py    all other django stuff