数学建模社区-数学中国

标题: python使用sshtunnel+pymssql连接远程数据库详解 [打印本页]

作者: 1047521767    时间: 2021-10-28 22:18
标题: python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。4 P2 p- F, @) M# {9 J
涉及库:pymssql、sshtunnel4 F0 l6 A9 H& X0 G3 k
涉及数据库:SQLSERVER! x7 ^2 @9 M2 R; I4 X5 Y) ^

2 f; [$ F1 W% l# s, Z& O: c0 }. s7 `场景如下:/ i' L7 p" G- ^$ V0 J3 R7 v. O
跳板机核心代码   def __get_ssh_connector(self):        # 远程连接/ W3 M5 l7 [, B8 f
        # 跳板机地址 端口,服务器账号,密码配置! C4 d5 N" _& j) T, b
        server = SSHTunnelForwarder(5 [, t: K, z3 U7 ~" L+ E. W
            (
) }0 t4 D; e( Q! `0 Q) G. d/ ]' ]                self.connect_config.get("ssh_host", ‘白名单服务器地址’),
! E( d( Z6 A7 o( |- @                self.connect_config.get("ssh_port", 22)
# d1 A7 N1 o% i$ y8 }) V: _  v8 K! x1 h            ),2 y4 ?6 M# m( l4 N, C4 Y3 u0 Q; k6 B
            ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),3 L8 F, K4 H( m
            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
5 g% k  A# D$ X            # 内网数据库地址和端口  F% }5 R( ^7 ]. [, G
            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
* M) ]* i$ w! z0 L! r0 X        )
+ Y# p  ?' |; R- I" K3 |) I* q- f+ P        server.start()
) G/ I2 e4 X8 U& }        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口& p% S5 d! n$ b5 T; a" k& V
pymssql 连接数据库核心代码 3 c+ P5 k- B7 I' ?" B; p) B. E
def get_mssql_connector(self):/ {- K4 ^0 |9 H. L% i' C) z
       return get_mssql_connector({1 i/ o3 p5 j7 g1 K
           "port": self.server.local_bind_port, #非常重要9 b0 O) S( s# c' ?& a, x2 h
           "username": ‘目标数据库账号’,8 X9 [1 [4 i' D/ _6 y
           "password": ‘目标数据库密码’,1 w7 s" n+ u8 z& B/ B) w
           "db": self.connect_config.get('db', ‘目标数据库’)8 J( ~' X  w  c/ U
       })
  P8 e9 I& O4 P2 n/ u% }$ S: U$ s2 h1 r' E, p
def __get_mssql_connector(database_config):5 k+ Z, W* q$ j( b
    host = database_config.get('host', '127.0.0.1')
& K5 I0 n% I6 e- G# n    port = database_config.get('port', ‘数据库端口’)! w' L" R" G1 M( T! P: ?# U: E' y
    user = database_config.get('username', ‘目标数据库账号’)1 z3 z5 ]8 H- f# t4 V
    passwd = database_config.get('password', ‘目标数据库密码’)& Q5 X9 W! Z3 t7 X, c
    db = database_config.get('db', ‘目标数据库’)
+ u% q, M( L+ W) \% J. I    return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")8 X5 ?9 C9 N7 T" ]
! F7 U& M9 v5 c7 Y" C" o# M
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect/ \. @( J3 r3 x

; `, e9 G" w6 e, i# v! H




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5