数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:18
标题: python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。# ?$ N1 d- h2 {* |0 J4 P! l* u
涉及库:pymssql、sshtunnel
% m" n% O- l# Z+ J. M3 ~# C  y5 ?涉及数据库:SQLSERVER: T; Z0 W& M% h; R1 g
( L4 J( D- _/ k
场景如下:7 Z! n. j. y; X) J% \: E  o5 c
跳板机核心代码   def __get_ssh_connector(self):        # 远程连接
- A6 b, h! ]" o! p1 t8 N% f        # 跳板机地址 端口,服务器账号,密码配置
* w4 K* L" O) P  Q        server = SSHTunnelForwarder(
2 C! Z5 A/ t! U' k/ W8 b. [+ c  T            (
$ R/ G" J& b% p" k& B                self.connect_config.get("ssh_host", ‘白名单服务器地址’),5 ?- o! M& g: _% b. N3 e: l, M) N
                self.connect_config.get("ssh_port", 22)
8 e  E. s: i* B            ),
" ~5 j8 A2 f7 m8 P& U5 {            ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),1 X. v$ T/ N: W
            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
; p3 I) t( ]2 h            # 内网数据库地址和端口
8 I0 x! P+ ]3 y1 I            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
3 ^4 H: O% [2 d2 B, A2 G        )* B1 }9 t& N# E" q5 b
        server.start()
8 U! ?" J, w+ F( J        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口
! H4 Z: g6 C6 [pymssql 连接数据库核心代码
3 X+ p. J$ `" A' V( l def get_mssql_connector(self):
* ]4 |% i0 W  J9 }0 t       return get_mssql_connector({- |9 m) h+ x& i8 G  b! X' w: g" n
           "port": self.server.local_bind_port, #非常重要, t3 Y* o/ D6 [! I% v3 q, \' O
           "username": ‘目标数据库账号’,- n+ T  l& f" Z. `0 S3 D# A& z4 S
           "password": ‘目标数据库密码’,
0 O1 S* H; O8 b6 g5 f" R9 \" k           "db": self.connect_config.get('db', ‘目标数据库’)6 K; j" E& l% I2 g$ ]
       })
4 N+ f7 `7 c8 a/ h- `+ E; x1 g' ^" ?7 B# l- }' I/ {
def __get_mssql_connector(database_config):( T; e% _: L+ A* ~1 \% m
    host = database_config.get('host', '127.0.0.1')8 Q/ Q6 s3 L* ^( r, E% X5 O
    port = database_config.get('port', ‘数据库端口’)
* S( }3 ]% ?6 n! T    user = database_config.get('username', ‘目标数据库账号’); a# d+ l8 [2 B$ B2 n
    passwd = database_config.get('password', ‘目标数据库密码’)
5 u; X0 y2 h% L/ H* d3 O0 z    db = database_config.get('db', ‘目标数据库’)  j/ i. z  m$ q4 m
    return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
0 v+ q/ g8 j% l5 Q, a7 |
* \/ U! u0 ^" h* `5 g) Q! H: HMySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
6 r: K+ T* J5 k5 Q) G  W* R0 c0 l/ t% t" T+ {





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