数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:18
标题: python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
) G9 D, f( d5 C& u涉及库:pymssql、sshtunnel
9 e9 A4 r4 D* S1 v' S3 o# d' k' V涉及数据库:SQLSERVER8 v" u& J0 u9 \7 ?% k

% e1 d( ?) b" U+ X7 [5 m1 c! F* @+ g, ?2 Y场景如下:* d7 K. D" _; y& W9 g( N% D
跳板机核心代码   def __get_ssh_connector(self):        # 远程连接% y+ `% P. V2 T# t: k, t7 ?" f
        # 跳板机地址 端口,服务器账号,密码配置- u! T( N( E0 N5 Q( _
        server = SSHTunnelForwarder(4 r' ]+ `( p  k. S4 D* B% m  ]
            (
5 q' g) n9 J' e- l                self.connect_config.get("ssh_host", ‘白名单服务器地址’),
/ N' J* o2 G8 `. A  \7 v$ |$ `( q( Q                self.connect_config.get("ssh_port", 22); F; j, U1 @" E
            ),! M: m+ N2 C0 p' e# \5 {/ L% P4 k2 c
            ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
$ v# V2 V) L2 r; F2 W            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),3 x( [' M, Q9 d
            # 内网数据库地址和端口
% _3 u* m1 Q( I' C9 G, v. {            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’)): z6 G+ A9 u. o
        )0 d+ m" e2 I, d8 }5 _! s: ~- z! h
        server.start()
) G9 D' Z0 L/ s        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口
1 W  I4 b& M) G" C/ D, Y  Dpymssql 连接数据库核心代码 ! e  k9 g$ u1 p6 F- e
def get_mssql_connector(self):5 m) J$ l2 y: i0 D# j! ]4 o( N) A
       return get_mssql_connector({/ i1 _* M  X6 e) [# s
           "port": self.server.local_bind_port, #非常重要8 U  t/ q0 v: n3 x- }6 A) r9 T
           "username": ‘目标数据库账号’,/ g/ S3 `4 H1 g" C: C6 S' q8 E/ N
           "password": ‘目标数据库密码’,7 @3 }  ?+ O- M2 y$ {& M
           "db": self.connect_config.get('db', ‘目标数据库’)
; d3 d' ^5 I, W" G       })
$ m7 W. Y9 p* H' s- B% x% B) l4 X1 {
def __get_mssql_connector(database_config):, r* r, C8 h2 r. g) v5 H5 u' s
    host = database_config.get('host', '127.0.0.1')4 o* h# b6 L3 ~0 V9 y* w
    port = database_config.get('port', ‘数据库端口’)
* O, t' t* C) U3 \4 Q% K  }    user = database_config.get('username', ‘目标数据库账号’)
/ C- P$ D; N' ^5 V    passwd = database_config.get('password', ‘目标数据库密码’)
1 z6 }6 X& f" z7 L, J$ P# E) n' @6 x    db = database_config.get('db', ‘目标数据库’)5 I! B7 k* X" l% ]( t3 S
    return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")1 `/ I) Q' f+ J1 d3 V

2 Q, {4 c, ?! ]3 J$ FMySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect/ z0 x9 I5 t; j9 D' ~

' R$ P9 K  }. Y




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