我想通过Python连接到远程PostgreSQL数据库来进行一些基本的数据分析。这个数据库需要SSL(verify-ca)以及三个文件(我有):
我无法找到一个描述如何与Python建立连接的教程。 任何帮助表示赞赏。
答案 0 :(得分:38)
使用psycopg2
模块。
您需要在连接字符串中使用ssl选项,或将它们添加为关键字参数:
import psycopg2
conn = psycopg2.connect(dbname='yourdb', user='dbuser', password='abcd1234', host='server', port='5432', sslmode='require')
在这种情况下,sslmode
指定需要SSL。
要执行服务器证书验证,您可以将sslmode
设置为verify-full
或verify-ca
。您需要在sslrootcert
中提供服务器证书的路径。同时将sslcert
和sslkey
值分别设置为客户端证书和密钥。
PostgreSQL Connection Strings documentation(参见参数关键词)和SSL Support中详细解释。
答案 1 :(得分:2)
您还可以将ssh隧道与paramiko和sshtunnel一起使用:
import psycopg2
import paramiko
from sshtunnel import SSHTunnelForwarder
mypkey = paramiko.RSAKey.from_private_key_file('/path/to/private/key')
tunnel = SSHTunnelForwarder(
(host_ip, 22),
ssh_username=username,
ssh_pkey=mypkey,
remote_bind_address=('localhost', psql_port))
tunnel.start()
conn = psycopg2.connect(dbname='gisdata', user=psql_username, password=psql_password, host='127.0.0.1', port=tunnel.local_bind_port)
答案 2 :(得分:0)
添加这个是为了完整性,因为我在 SO 上的其他任何地方都找不到它。就像@mhawke 说的那样,您可以使用 psycopg2
,但您也可以使用任何其他 Python 数据库模块(ORM 等),这些模块允许您手动指定要连接的数据库 postgresql URI(postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
) sslmode="require"
用于强制 ssl 连接的 psycopg2.connect
参数只是您用于连接到数据库的 postgresql://
URI 的一部分(请参阅 33.1.2. Parameter Key Words)。因此,如果您想使用 sqlalchemy
或其他 ORM 而不是普通的 psycopg2
,您可以将所需的 sslmode
添加到数据库 URI 的末尾并以这种方式连接。
import sqlalchemy
DATABASE_URI = "postgresql://postgres:postgres@localhost:5432/dbname"
# sqlalchemy 1.4+ uses postgresql:// instead of postgres://
ssl_mode = "?sslmode=require"
DATABASE_URI += ssl_mode
engine = sqlalchemy.create_engine(URI)
Session = sqlalchemy.orm.sessionmaker(bind=engine)
关于 SSL 支持的 postgres 文档中有一个漂亮的数字 (Table 33.1),它分解了您可以提供的不同选项。如果您想使用任何需要指定特定证书路径的更高级选项,您可以将其与格式字符串一起放入。