python - 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 时才有效。我已断开所有其他服务器的连接以避免端口冲突,但我得到了同样的错误。
解决方案
pgAdmin4 创建的隧道是供自己使用的。它没有安排它在 5432 上进行侦听,它选择了一些任意的高编号端口,并且不宣传那是什么端口。虽然您可以使用系统工具(如 netstat)发现它正在侦听的端口,然后连接到它,但通过寻找其他方法来设置隧道可能会更好。有 python 库可以帮助解决这个问题。
至于为什么你可以连接到 5432,显然那里有一些东西在听,要么是 PostgreSQL,要么是假装是 PostgreSQL,但它似乎不是你想要的。您可以使用netstat -ao
它找到它的pid,然后根据它进行查找。
推荐阅读
- c# - 在 c# 中取消 Parallel.ForEach 中的单个任务或特定任务
- ios - Alamofire 仅为特定请求设置超时
- javascript - 如何使用 Jest 模拟 mailgun.messages().send()?
- dask - 在 DASK RandomizedSearchCV 中实现 SMOTEENN
- vue.js - 如何解决通过方法触发或不触发 vue-transitions 的问题
- c++ - 使 VS Code 自动完成包含整个项目的标头
- r - 循环以重构时间序列的数据
- json - 使用 circe lib for scala 通过 json 路径解析 JSON
- git - repo sync 命令的替代方案是什么?
- c++ - leetcode 88. 合并排序数组 c++ 运行时错误