2012-05-15 45 views
8

Vì vậy, tôi đang làm theo hướng dẫn bắt đầu từ heroku với django. Tuy nhiên khi tôi chạy lệnh này:Triển khai Django đến Heroku (Lỗi Psycopg2)

heroku run python manage.py syncdb 

tôi nhận được lỗi này

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

tôi cho rằng điều này có nghĩa rằng db chưa được thiết lập chưa ... vì vậy tôi tự thêm vào tùy chọn shared_db cũng :

heroku addons:add shared-database:5mb 

Nhưng .. Tôi vẫn gặp lỗi tương tự. Đưa cái gì?

+0

Bạn có thể thử bằng một tập lệnh đơn giản để thực hiện kết nối thủ công nếu đó là vấn đề chung hoặc cụ thể đối với Django. – schlamar

+0

Có cùng sự cố, bạn đã khắc phục sự cố đó chưa? –

Trả lời

1

cấu trúc ứng dụng của tôi là tắt ... Heroku muốn cấu trúc trông như thế này:

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

Bạn cần phải thêm này để requirements.txt của bạn:

psycopg2 

Theo mặc định Heroku cấu hình cơ sở dữ liệu Postgres và tiêm nhiễm đoạn code vào settings.py của bạn (https://devcenter.heroku.com/articles/ django # postgres_database_config). Điều này đọc từ biến môi trường DATABASE_URL, nhưng không yêu cầu psycopg2 được cài đặt.

+0

Điều đó tồn tại trong tệp requirements.txt của tôi, đã làm theo các hướng dẫn thiết lập sau: https://devcenter.heroku.com/articles/django – Msencenb

2

tôi nhận nó làm việc bằng cách thêm đoạn mã sau vào settings.py bản thân mình, dường như vì một lý do Heroku didn' t thêm nó cho tôi ....

Thông thường nó luôn thêm mã trên Heroku động nhưng tôi đoán sau khi django 1.4 nó didnt làm điều đó nữa vì lý do nào. Hoặc tôi đã làm sai điều gì đó.

Dù sao đây là mã chỉ thêm nó vào settings.py của bạn và nó sẽ hoạt động như trước đây.

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

Tôi đang chạy django 1.3.1 vẫn ... upvoting cho giải pháp 1.4 có thể :) – Msencenb

+0

Đã làm bạn thử không Nó có thể làm việc cho 1,3 cũng, nó có thể liên quan đến việc sử dụng Shared DB isntead của Dev DB, nhưng không thể xác minh điều đó. Tôi nghĩ rằng điều này cũng có thể khắc phục sự cố của bạn. –

8

EDITED:

Như @mipadi đã chỉ ra ở đây (http://stackoverflow.com/questions/13001031/django-heroku-settings-injection/13092534), nó có thể thực sự được đơn giản như sau:

import dj_database_url 

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

Điều này có tác dụng nếu bạn có bộ biến DATABASE_URL env. heroku: pg_promote nhận được của bạn ở đó. Thông tin chi tiết dưới đây


Đảm bảo bạn có Postgres trên Heroku bạn

heroku addons:add heroku-postgresql:dev 

Bước 1: tìm ra bạn url cơ sở dữ liệu

heroku config | grep POSTGRESQL 

Kết quả sẽ giống như thế này:

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

Bước 2: Lấy tên cài đặt từ bước trước (ví dụ:HEROKU_POSTGRESQL_ROSE_URL) và đặt nó trong các thiết lập của bạn tập tin như vậy

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

[UPDATE] Như Ted đã chỉ ra, có một cách để thúc đẩy các URL màu để biến DATABASE_URL:

heroku pg:promote HEROKU_POSTGRESQL_ROSE_URL 

thiết lập cơ sở dữ liệu của bạn có thể sau đó sử dụng DATABASE_URL như trái ngược với URL màu để kỳ lạ hơn

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

Bob là chú của bạn

+1

Đối với những người vẫn còn đấu tranh với Heroku + Django, tôi đã đặt cùng một bản mẫu để có được đi nhanh. Rất ý kiến ​​nhưng nó được thực hiện công việc: https://github.com/callmephilip/django-heroku-bootstrap –

1

tôi đã cùng một vấn đề, đây là cách tôi giải quyết nó

Bước 1: Thực hiện theo Phillip của Bước 1 để có được tên cơ sở dữ liệu (màu)

Bước 2:

$ heroku pg:promote HEROKU_POSTGRESQL_<COLOR> 

dẫn đến sản lượng

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

Rất đẹp, Ted. Tôi sẽ kết hợp bit này trong câu trả lời ban đầu của tôi –

Các vấn đề liên quan