2012-05-15 4 views
8

Итак, я следую руководству по началу работы от героку с django. Однако, когда я запускаю эту команду:Развертывание Django для Heroku (ошибка Psycopg2)

heroku run python manage.py syncdb 

Я получаю эту ошибку

psycopg2.OperationalError: could not connect to server: Connection refused 
Is the server running on host "localhost" and accepting 
TCP/IP connections on port 5432? 

Я предположил, что это означает, что БД не была создана еще ... так что я вручную добавил опцию shared_db, а также :

heroku addons:add shared-database:5mb 

Но .. Я все еще получаю ту же ошибку. Что дает?

+0

Не могли бы вы попробовать с помощью простого сценария, выполняющего ручное соединение, если это общая проблема или специфическая для Django. – schlamar

+0

Имея ту же проблему, вы исправили ее в конце? –

ответ

1

Моя структура приложение была выключена ... Heroku хочет структуру выглядеть следующим образом:

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

Вы должны добавить к вашей requirements.txt:

psycopg2 

По умолчанию Heroku настраивает базу данных Postgres и вводит код в settings.py (https://devcenter.heroku.com/articles/ Джанго # postgres_database_config). Это читается из переменной среды DATABASE_URL, но требует установки psycopg2.

+0

Что существует в моем файле требований.txt, выполнял следующие инструкции по установке: https://devcenter.heroku.com/articles/django – Msencenb

2

Я получил это работает, добавив следующий код settings.py самого, кажется, по какой-то причине Heroku Ждет» t добавить его для меня ....

Обычно он всегда добавлял код на Heroku динамически, но я думаю, после django 1.4 он почему-то не делал этого по какой-то причине. Или я просто делал что-то неправильно.

В любом случае это код, просто добавьте его в свой файл settings.py, и он должен работать по-прежнему.

import sys 
import urlparse 
import 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() 
+0

Я запускаю django 1.3.1 все еще ... upvoting для возможного решения 1.4 :) – Msencenb

+0

Did вы попробуете это? Он может работать и для 1.3, он может быть связан с использованием Shared DB isntead из Dev DB, но не может проверить это. Я думаю, это может также решить вашу проблему. –

8

EDITED:

Как @mipadi указал здесь (http://stackoverflow.com/questions/13001031/django-heroku-settings-injection/13092534), это может быть на самом деле так же просто:

import dj_database_url 

DATABASES = {'default' : dj_database_url.config() } 

Это работает, если у вас установлена ​​переменная env переменной DATABASE_URL. heroku: pg_promote получает ваш там. Подробности ниже


Убедитесь, что вы Postgres на вашем Heroku

heroku addons:add heroku-postgresql:dev 

Шаг 1: выяснить ваш URL базы данных

heroku config | grep POSTGRESQL 

Результат будет выглядеть примерно так:

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

Шаг 2: Возьмите имя параметра с предыдущего этапа (например,HEROKU_POSTGRESQL_ROSE_URL) и поместить его в настройках файла, как так

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

[UPDATE] Как Тед отметил, что есть способ продвижения цвета URL к переменной DATABASE_URL:

heroku pg:promote HEROKU_POSTGRESQL_ROSE_URL 

настройки вашей базы данных может затем использовать DATABASE_URL в отличие от более экзотических цветных URLS

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

Боб твой дядя

+1

Для тех, кто все еще борется с Heroku + Django, я собрал шаблон, чтобы двигаться быстро. Очень упрямый, но он заработал: https://github.com/callmephilip/django-heroku-bootstrap –

1

У меня была та же проблема, это то, как я ее решил

Шаг 1: Выполните шаг 1 Phillip, чтобы получить имя базы данных (цвет)

Шаг2:

$ heroku pg:promote HEROKU_POSTGRESQL_<COLOR> 

приводит к выходу

Promoting HEROKU_POSTGRESQL_<COLOR> to DATABASE_URL... done 
+0

Очень приятно, Тед. Я включу этот бит в свой первоначальный ответ –

Смежные вопросы