SQLAlchemy无法连接到localhost上的Postgresql

lui*_*iel 3 postgresql sqlalchemy flask-sqlalchemy

如果我只能找到它的位置,我确信这是一个很容易修复的错误.这是Flask应用程序的错误:

11:58:18 web.1  | ERROR:xxxxxx.core:Exception on / [GET]
11:58:18 web.1  | Traceback (most recent call last):
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app
11:58:18 web.1  |     response = self.full_dispatch_request()
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
11:58:18 web.1  |     rv = self.handle_user_exception(e)
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
11:58:18 web.1  |     reraise(exc_type, exc_value, tb)
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
11:58:18 web.1  |     rv = self.dispatch_request()
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1461, in dispatch_request
11:58:18 web.1  |     return self.view_functions[rule.endpoint](**req.view_args)
11:58:18 web.1  |   File "xxxxxxx/web.py", line 202, in home
11:58:18 web.1  |     d = {'featured': cached_apps.get_featured_front_page(),
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask_cache/__init__.py", line 245, in decorated_function
11:58:18 web.1  |     rv = f(*args, **kwargs)
11:58:18 web.1  |   File "/Users/xxxxxxx/Desktop/PythonProjects/xxxxxx/xxxxxx2/xxxxxxx/cache/apps.py", line 35, in get_featured_front_page
11:58:18 web.1  |     results = db.engine.execute(sql)
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 780, in engine
11:58:18 web.1  |     return self.get_engine(self.get_app())
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 797, in get_engine
11:58:18 web.1  |     return connector.get_engine()
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 470, in get_engine
11:58:18 web.1  |     self._sa.apply_driver_hacks(self._app, info, options)
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 739, in apply_driver_hacks
11:58:18 web.1  |     if info.drivername.startswith('mysql'):
11:58:18 web.1  | AttributeError: 'NoneType' object has no attribute 'drivername'
Run Code Online (Sandbox Code Playgroud)

从我在网上找到的,似乎问题是我可能无法正确连接到数据库.该应用程序在Heroku中工作正常,但在我运行localhost时却不行.

which psql:

/Applications/Postgres.app/Contents/MacOS/bin/psql
Run Code Online (Sandbox Code Playgroud)

which postgres:

/Applications/Postgres.app/Contents/MacOS/bin/postgres
Run Code Online (Sandbox Code Playgroud)

Postgres.app正在运行5432.

我不知道还有什么要检查.

如果它应该连接到heroku上的相同postgres数据库,为什么它会在heroku上工作,但不能从localhost工作?

也许localhost上的应用程序使用的是Postgres的错误版本?我已经尝试卸载它们(并且只留下Postgres.app),但我不确定我的计算机上是否还有任何导致冲突的内容.我该怎么检查?我很感激任何帮助.

编辑:更多信息
alembic.ini文件中的段:

[alembic]
# path to migration scripts
script_location = alembic

# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s

# under Heroku, the line below needs to be inferred from
# the environment
sqlalchemy.url = postgres://xxxxxxxxxx:xxxxxxxxxxxx@xxxxxx.compute-1.amazonaws.com:5432/xxxxxxxxx

# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic
Run Code Online (Sandbox Code Playgroud)

我有一个产生同样的错误很短的脚本:我跑python cli.py db_create

#!/usr/bin/env python
import os
import sys
import optparse
import inspect

import xxxxxxx.model as model
from xxxxxx.core import db
import xxxxx.web as web

from alembic.config import Config
from alembic import command    
def setup_alembic_config():
    if "DATABASE_URL" not in os.environ:
        alembic_cfg = Config("alembic.ini")
    else:
        dynamic_filename = "alembic-heroku.ini"
        with file("alembic.ini.template") as f:
            with file(dynamic_filename, "w") as conf:
                for line in f.readlines():
                    if line.startswith("sqlalchemy.url"):
                        conf.write("sqlalchemy.url = %s\n" %
                                   os.environ['DATABASE_URL'])
                    else:
                        conf.write(line)
        alembic_cfg = Config(dynamic_filename)

    command.stamp(alembic_cfg, "head")

def db_create():
    '''Create the db'''
    db.create_all()
    # then, load the Alembic configuration and generate the
    # version table, "stamping" it with the most recent rev:
    setup_alembic_config()
    # finally, add a minimum set of categories: Volunteer Thinking, Volunteer Sensing, Published and Draft
    categories = []
    categories.append(model.Category(name="Thinking",
                                     short_name='thinking',
                                     description='Volunteer Thinking apps'))
    categories.append(model.Category(name="Volunteer Sensing",
                                     short_name='sensing',
                                     description='Volunteer Sensing apps'))
    db.session.add_all(categories)
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)

我得到:

Traceback (most recent call last):
  File "cli.py", line 111, in <module>
    _main(locals())
  File "cli.py", line 106, in _main
    _methods[method](*args[1:])
  File "cli.py", line 33, in db_create
    db.create_all()
  File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 856, in create_all
    self._execute_for_all_tables(app, bind, 'create_all')
  File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 848, in _execute_for_all_tables
    op(bind=self.get_engine(app, bind), tables=tables)
  File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 797, in get_engine
    return connector.get_engine()
  File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 470, in get_engine
    self._sa.apply_driver_hacks(self._app, info, options)
  File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 739, in apply_driver_hacks
    if info.drivername.startswith('mysql'):
AttributeError: 'NoneType' object has no attribute 'drivername'
Run Code Online (Sandbox Code Playgroud)

Mar*_*eth 9

我的猜测是你没有正确配置Flask-SQLAlchemy.你有很多代码似乎试图配置它,但没有经历所有这些代码,我的猜测是它要么错误地设置你的配置,要么设置你的配置太晚了.

确保在调用将要访问数据库的任何内容(例如db.create_all())之前,将app.config["SQLALCHEMY_DATABASE_URI"]其设置为正确的URI.它可能设置为None,这导致您的问题.