如何用Python连接带SSH隧道的PostgreSQL在线数据库?
Python连接带SSH隧道的PostgreSQL数据库方案
先明确你之前的错误原因
你用了ODBC Driver 18 for SQL Server驱动去连PostgreSQL,这完全不匹配——SQL Server的驱动无法识别PostgreSQL的连接协议,所以才报驱动找不到的错误。PostgreSQL得用专门的Python适配库,再配合SSH隧道才能连接到AWS上的目标数据库。
步骤1:安装必要依赖
先装两个关键库:psycopg2-binary(PostgreSQL的Python适配库,binary包无需本地编译)和sshtunnel(用来建立SSH隧道):
pip install psycopg2-binary sshtunnel
步骤2:完整连接代码
把你的SSH和PostgreSQL配置信息填入对应位置即可,代码已加注释说明:
from sshtunnel import SSHTunnelForwarder import psycopg2 # ---------------------- SSH配置 ---------------------- SSH_HOST = "你的SSH主机/IP" SSH_USER = "SSH用户名" SSH_PRIVATE_KEY_PATH = "你的私钥文件路径(比如~/.ssh/id_rsa)" # ---------------------- PostgreSQL配置 ---------------------- PG_HOST = "[....]amazonaws.com" PG_DB = "你的数据库名" PG_USER = "PostgreSQL用户名" PG_PWD = "PostgreSQL密码" PG_PORT = 5432 # PostgreSQL默认端口,未修改的话无需改动 # 建立SSH隧道 with SSHTunnelForwarder( (SSH_HOST, 22), # SSH默认端口为22,若修改过请替换 ssh_username=SSH_USER, ssh_pkey=SSH_PRIVATE_KEY_PATH, remote_bind_address=(PG_HOST, PG_PORT) ) as tunnel: # 连接PostgreSQL数据库 conn = psycopg2.connect( host="127.0.0.1", # 隧道映射到本地的地址 port=tunnel.local_bind_port, database=PG_DB, user=PG_USER, password=PG_PWD ) # 执行只读查询(你仅拥有只读权限) with conn.cursor() as cur: cur.execute("SELECT * FROM 你的表名 LIMIT 10;") rows = cur.fetchall() for row in rows: print(row) # 关闭数据库连接 conn.close()
注意事项
- 如果你的私钥设有密码,在
SSHTunnelForwarder中添加ssh_private_key_password="你的私钥密码"参数即可 - 确保本地机器能正常访问SSH主机,私钥文件权限需正确设置(Linux/macOS下执行
chmod 600 私钥文件路径) - 所有配置项需替换为你实际的信息,不要保留占位符
- 代码中使用
with语句会自动关闭隧道和数据库连接,避免资源泄漏
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

