在Heroku上使用Django和PostgreSQL应用程序未同步

5

我正在尝试按照Heroku上的Django教程运行,教程链接如下:

在Heroku上开始使用Django

一切都很顺利,直到我遇到了syncdb部分:

同步数据库

当我运行heroku run python manage.py syncdb时,出现以下错误:

psycopg2.OperationalError: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我目前正在使用Homebrew安装的PostgreSQL,它运行良好:

LOG:  database system is ready to accept connections
LOG: autovacuum launcher started

应用服务器也在本地运行:
Validating models...

0 errors found
Django version 1.4.1, using settings 'hellodjango.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

我正在使用Mac OS 10.7进行工作。

我将要部署到Heroku的代码在此处可用:

链接到我的代码

我已经尝试了许多可能的解决方案,例如:

http://jeffammons.net/2011/09/fixing-postgres-on-mac-10-7-tiger-for-django/

但似乎没有任何作用。

编辑:

我在四处寻找时发现了这段代码,并将其添加到settings.py文件中,它似乎解决了我的问题:

# Register database schemes in URLs.
urlparse.uses_netloc.append('postgres')
urlparse.uses_netloc.append('mysql')

try:
    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() 
3个回答

1
我刚刚在Heroku上使用postgresql部署了一个Django应用程序,这是我的代码,它完美地运行着,希望能够帮到你:

requirements.txt

Django==1.7.4
dj-database-url==0.3.0
dj-static==0.0.6
gunicorn==19.2.1
psycopg2==2.6
six==1.9.0
static3==0.5.1
wsgiref==0.1.2

wsgi.py

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<PROJECT_NAME>.settings")

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

Procfile
web: gunicorn <PROJECT_NAME>.wsgi

确保你的Heroku上有Postgres:

heroku addons:add heroku-postgresql:dev

找出数据库URL环境变量。它会像这样:HEROKU_POSTGRESQL__URL
heroku config | grep POSTGRESQL

settings.py

import dj_database_url
POSTGRES_URL = "HEROKU_POSTGRESQL_<DB_NAME>_URL"
DATABASES = {'default': dj_database_url.config(default=os.environ[POSTGRES_URL])}

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Allow all host headers
ALLOWED_HOSTS = ['*']

# Static asset configuration
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

之后,我只需将所有内容推送到主分支并运行syncdb。

heroku run python manage.py syncdb

这可能会有帮助 在Heroku上开始使用Django。如果有什么问题或需要其他帮助,请告诉我。

1
在您所链接的原始代码的settings.py文件中,似乎对于您的DATABASES设置有两个相互矛盾的声明:

1)第3行:

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

2) 第16行:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'traineeworld',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

3) 此外,您最新编辑的附加代码似乎是另一种指定连接参数的方法,这可能会再次抵消之前声明的效果。

这些方法不应该堆叠在一起。您只需要选择一个。

此外,从客户端连接到数据库服务器的发起者技术上应该“知道”服务器是通过TCP(在这种情况下是主机名或IP地址加端口)还是通过Unix域套接字文件进行访问,在这种情况下是完整的目录路径(以斜杠开头)。在两种情况下,这都进入连接参数的“HOST”部分。

Postgres为所有这些提供默认值,但是一旦您混合和匹配来自不同来源的不同软件部分,这些默认值就不再有用,并且提供显式值成为必需。

如果对套接字路径有疑问,在作为postgres用户连接时,可以通过SQL命令获取此路径:

SHOW unix_socket_directory;

这个设置也存在于服务器端的postgresql.conf配置文件中。


0

很可能是因为您没有在数据库上加载端口。您的代码加载数据库连接是什么样子的?


这是命令行。Python代码可在我提供的链接中获取。 - Filipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接