Python连接远程数据库

当你的数据库架设在远程主机而非本机的虚拟机中,需要下面两步:
①利用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)
	...
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值