连接postgres和Python

时间:2015-01-24 19:11:27

标签: python postgresql ssh

我在远程主机上有一个数据库。当我使用putty和SSH时,我能够访问它。数据库本身没有密码。只有SSH连接有密码。但是,当我尝试使用Python连接它时,它会要求输入密码。我是postgres和paramiko的新手。

以下是我尝试的内容:

import psycopg2
import paramiko
import time
t = paramiko.Transport(('xxx.com', 22))
t.connect(username="xxx", password='xxx') 
c = paramiko.Channel(t)
conn = psycopg2.connect("dbname='xxx'")
curs = conn.cursor()
sql = "select * from xxx"
curs.execute(sql)
rows = curs.fetchall()
print(rows)

我试过的其他方法是:

import os, psycopg2
os.system("ssh xxx@xxx.com -fNL 5432:localhost:5432 -p 22")
while True:
    try:
        conn = psycopg2.connect("dbname='xxx'")
        curs = conn.cursor()
        sql = "select * from xxx"
        curs.execute(sql)
        rows = curs.fetchall()
        print(rows)
    except:
        print "I am unable to connect to the database"

这使我无法请求本地转发'错误。

还有其他方法可以解决这个问题吗? 我有一台装有Python 2.7的Windows 7(x64)机器。请帮我。感谢。

1 个答案:

答案 0 :(得分:1)

您应该连接到远程服务器并将远程PostgreSQL的端口转发到本地端口。

没有paramiko,就是这样的:

# start port forwarding
$ ssh -L PGSQL_LOCAL_PORT:localhost:PGSQL_REMOTE_PORT user@xxx.com
# in python
psycopg.connect("dbname='xxx' host='localhost' port='PGSQL_LOCAL_PORT'")

以下是使用paramiko执行此操作的示例 https://code.ros.org/trac/wg-ros-pkg/browser/pkg/trunk/paramiko/demos/forward.py?rev=30

注意:端口转发是阻止操作。因此,您必须在单独的线程/进程中启动端口转发。