当你的数据库架设在远程主机而非本机的虚拟机中,需要下面两步:
①利用SSH连接远程主机
②连接其中的数据库
而如何在Python代码中先后实现这两个操作呢?
无需担心,PostGreHelper帮你解决这个问题(连接PostgreSQL的代码,贴在最下方)。
不过要看懂这个代码,并加以改动使之可用于连接其他数据库,请先看关键代码解析。
关键代码解析
关键代码在于get_connection中的代码逻辑,分别对应于前面所述的两个步骤。请看下面的代码及详细注释:
import sshtunnel
def get_connection(self):
# 1. 利用 SSH 连接远程主机(这一步是无论哪种类型的数据库都通用的)
server = sshtunnel.SSHTunnelForwarder(
('远程主机地址', 远程主机端口),
ssh_username='登录远程主机的用户名',
ssh_password='远程主机的密码',
remote_bind_address=('远程主机ifconfig中的地址', 数据库的端口号),
local_bind_address=('127.0.0.1', 13306)
)
server.start()
# 2. 连接其中的数据库(这一步是需要调用不同数据库对应的方法)
# 比如psycopg2是PostgreSQL对应的连接库
self._conn = psycopg2.connect(
database='数据库名',
user='登录数据库的名',
password="数据库用户的密码",
host='127.0.0.1',
port=13306
)
PostGreHelper
import time
import psycopg2
from psycopg2 import ProgrammingError
import sshtunnel
class PostGreHelper(object):
def __init__(self, database=None, user="postgres", password=None, host="127.0.0.1", port="13306"):
self._cursor = None
self._conn = None
self._database = database
self._user = user
self._password = password
self._host = host
self._port = port
self._result = None
def get_connection(self):
server = sshtunnel.SSHTunnelForwarder(
('远程主机地址', 远程主机端口),
ssh_username='登录远程主机的用户名',
ssh_password='远程主机的密码',
remote_bind_address=('远程主机ifconfig中的地址', 5432),
local_bind_address=('127.0.0.1', 13306)
)
server.start()
self._conn = psycopg2.connect(
database=self._database,
user=self._user,
password=self._password,
host=self._host,
port=self._port)
# 关闭数据库连接
def close_connection(self):
# 事务提交
self._conn.commit()
# # 关闭数据库连接
# self._cursor.close()
self._conn.close()
# 通用执行方法
def execute_method(self, sql):
# 获取连接
self.get_connection()
cur = self._conn.cursor()
# 执行查询命令
cur.execute(sql)
try:
rows = cur.fetchall()
except ProgrammingError:
return
self.close_connection()
return rows
if __name__ == '__main__':
pg_helper = PostGreHelper(database="postgres", password="postgres", host="127.0.0.1", port=13306)
...