Tornado 中与 Heroku 的 Postgres 连接问题

Postgres Connection Issues with Heroku in Tornado

我正在 运行在 Heroku 上安装一个 tornado 应用程序,直到此时,一切都进展顺利,我正在尝试添加一个 Heroku Postgres 附加组件。此时,我可以使用 Heroku's python guide while exporting DATABASE_URL=postgres:///$(whoami) as shown here 在本地连接。但是,当我 运行 heroku localheroku config:get DATABASE_URL 给出的 DATABASE_URL 时,我得到以下堆栈跟踪:

[OKAY] Loaded ENV .env File as KEY=VALUE Format
5:48:26 PM web.1 |  Traceback (most recent call last):
5:48:26 PM web.1 |    File "src/myapp/app.py", line 61, in <module>
5:48:26 PM web.1 |      main()
5:48:26 PM web.1 |    File "src/myapp/app.py", line 55, in main
5:48:26 PM web.1 |      app = MyApplication()
5:48:26 PM web.1 |    File "src/myapp/app.py", line 35, in __init__
5:48:26 PM web.1 |      self.db = self.connect_to_db()
5:48:26 PM web.1 |    File "src/myapp/app.py", line 49, in connect_to_db
5:48:26 PM web.1 |      port=url.port
5:48:26 PM web.1 |    File "/usr/lib/python3/dist-packages/psycopg2/__init__.py", line 164, in connect
5:48:26 PM web.1 |      conn = _connect(dsn, connection_factory=connection_factory, async=async)
5:48:26 PM web.1 |  psycopg2.OperationalError: FATAL:  database "heroku_username" does not exist

我的 运行Tornado 应用程序代码如下所示:

from os import environ

from psycopg2 import connect

from tornado.ioloop import IOLoop
from tornado.options import define
from tornado.options import options
from tornado.options import parse_command_line
from tornado.web import Application

from urllib.parse import urlparse
from urllib.parse import uses_netloc


define('debug', default=True, help='debug is on or not')
define('port', default=8888, help='run on given port', type=int)


class MyApplication(Application):

    def __init__(self):
        handlers = [
            (r'/health', HealthCheckHandler)
        ]
        settings = dict(debug=options.debug)

        self.db = self.connect_to_db()
        Application.__init__(self, handlers, **settings)

    def connect_to_db(self):
        """Connects to the database instance."""
        uses_netloc.append('postgres')
        url = urlparse(environ['DATABASE_URL'])
        print(url.username)

        conn = connect(
            database=url.path[1:0],
            user=url.username,
            password=url.password,
            host=url.hostname,
            port=url.port
        )


def main():
    parse_command_line()
    app = MyApplication()
    app.listen(options.port)
    IOLoop.current().start()


if __name__ == '__main__':
    main()

嗯,原来我今天想当白痴。如果有人对答案感兴趣,在 connection 函数的 connect_to_db 中,我用 database=url.path[1:0] 代替了 database=url.path[1:]。实际上,我没有指定数据库。