Pandas 使用 SSH 隧道和 sqlalchemy 从远程 Postgresql 读取

时间:2021-07-15 16:10:34

标签: python pandas postgresql ssh sqlalchemy

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

  Name   Surname   Age   City 
  <chr>  <chr>     <chr> <chr>
1 ANGELA SMITH     22    LA   
2 ANDREW D'ONOFRIO 47    NYC  

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

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

这里的用户名和密码是远程数据库的。我得到 engine = create_engine('postgresql://username:password@localhost/db_name') 。但是,使用相同的用户名和密码,我可以访问 PgAdmin 中的表。

据我所知,由于 ssh 隧道,我必须使用 sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: password authentication failed for user 而不是远程服务器地址,对吗?在 pgAdmin 中,我可以看到服务器正在运行。所以,我的问题是如何使用 ssh 隧道从远程 postgresql 数据库读取表?在示例中,我看到有人使用不同的端口(与 5432 不同),但对我而言,设置仅在我使用端口 5432 时才有效。我已断开所有其他服务器的连接以避免端口冲突,但我遇到了相同的错误。

1 个答案:

答案 0 :(得分:1)

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

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