首页 > 解决方案 > Pandas 使用 SSH 隧道和 sqlalchemy 从远程 Postgresql 读取

问题描述

我可以像这样从我的本地 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 时才有效。我已断开所有其他服务器的连接以避免端口冲突,但我得到了同样的错误。

标签: pythonpandaspostgresqlsshsqlalchemy

解决方案


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

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


推荐阅读