【问题标题】:Pandas read from remote Postgresql with SSH tunnel and sqlalchemyPandas 使用 SSH 隧道和 sqlalchemy 从远程 Postgresql 读取
【发布时间】:2021-09-24 13:34:30
【问题描述】:

我可以像这样从本地 psql 实例中读取数据:

engine = create_engine('postgresql://postgres:postgres@localhost/db_name')
df = pd.read_sql("select * from table_name;", engine)

我有一个远程 postgresql 服务器,我在 PgAdmin4 和 pycharm 中都通过 ssh 隧道成功访问了该服务器。我使用公钥文件登录到远程服务器。现在,我的问题是如何使用 pandas 访问该数据库。我试过了:

engine = create_engine('postgresql://username:password@localhost/db_name')

这里,用户名和密码是远程数据库的。我得到sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: password authentication failed for user。但是,使用相同的用户名和密码,我可以访问 PgAdmin 中的表。

根据我的阅读,由于 ssh 隧道,我必须使用 localhost 而不是远程服务器地址,对吧?在 pgAdmin 中,我可以看到服务器正在运行。所以,我的问题是如何使用 ssh 隧道从远程 postgresql 数据库中读取表?在示例中,我看到人们使用不同的端口(不同于 5432),但对我来说,只有在我使用端口 5432 时设置才有效。我已断开所有其他服务器以避免端口冲突,但我得到了同样的错误。

【问题讨论】:

  • 你是如何创建隧道的?
  • 在 pgAdmin 中,我创建了新服务器,在Connection 下将localhost 作为主机名,并在那里提供了远程数据库用户名和密码。最后在SSH Tunnel下,我设置了ssh隧道

标签: python pandas postgresql ssh sqlalchemy


【解决方案1】:

pgAdmin4 创建的隧道是供自己使用的。它没有安排它在 5432 上进行侦听,它选择了一些任意的高编号端口,并且不宣传那是什么端口。虽然您可以使用系统工具(如 netstat)发现它正在侦听的端口,然后连接到它,但通过寻找其他方法来设置隧道可能会更好。有一些 python 库可以帮助解决这个问题。

至于为什么你可以连接到 5432,很明显那里有一些东西在监听,要么是 PostgreSQL,要么是伪装成 PostgreSQL,但它似乎不是你想要的。您可以使用netstat -ao 找到它的pid,然后根据它进行查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2015-12-02
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2015-03-01
    • 2018-10-29
    • 2023-01-25
    相关资源
    最近更新 更多