数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:18
标题: python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
  r) }+ B- e; `) Y涉及库:pymssql、sshtunnel& \; f) D$ @$ v0 m; m! E
涉及数据库:SQLSERVER
9 C) m) S. e" g/ _. i' b0 S- {2 l( u- _3 r0 a& W0 m7 H) m' v( T* W6 r# f7 X8 @
场景如下:/ b" u. }. f( ^$ `
跳板机核心代码   def __get_ssh_connector(self):        # 远程连接
' ^; J5 ~' \% r8 T        # 跳板机地址 端口,服务器账号,密码配置
/ ]9 ]+ Q/ U  _; o7 Y! E        server = SSHTunnelForwarder(4 O0 G$ J* L6 v3 F. J: o% Q
            (6 a. }3 r$ Z5 O/ ?
                self.connect_config.get("ssh_host", ‘白名单服务器地址’),
" H7 P# {( k$ X                self.connect_config.get("ssh_port", 22)* Z1 `( M6 }" B& f- z7 g
            ),' U- S) Z0 Y8 y! v; O( J: h
            ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),# e1 j! f. U3 X. y! M; k( W
            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),2 ]3 o1 n! U# p! p6 z7 `
            # 内网数据库地址和端口
0 p" S6 m# m2 s$ K            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
. C  D/ U! U# Y( E        )
: [! q8 H3 l! }7 K6 b        server.start()
( E! o4 x& u* w# J/ }( a. z4 x% \        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口: ]: E, S  ?0 j
pymssql 连接数据库核心代码 6 M5 e* R2 _0 o; a
def get_mssql_connector(self):
" Z* J( K% B0 Z3 A+ `/ ~3 x       return get_mssql_connector({
- Z  P0 [: L( A           "port": self.server.local_bind_port, #非常重要
- A+ s# W  X" Z( t( p  P4 A           "username": ‘目标数据库账号’,
# l, Y1 R. b- Y; s           "password": ‘目标数据库密码’,
0 ?+ q3 F) D. n0 [% `  b           "db": self.connect_config.get('db', ‘目标数据库’)
3 K2 e# F3 K8 ~0 q: b       })4 k9 e, _: X3 x5 p
! E. Y7 [3 y3 {2 v
def __get_mssql_connector(database_config):
: d* b& Y9 P% |9 A5 [: ?    host = database_config.get('host', '127.0.0.1'): {5 w7 x& C2 @" n& \
    port = database_config.get('port', ‘数据库端口’)
/ E9 s9 G/ t; h9 U/ Y! a    user = database_config.get('username', ‘目标数据库账号’)! F) B1 s2 h' O  t2 N
    passwd = database_config.get('password', ‘目标数据库密码’)
8 J/ w. A. G2 I. W4 r8 |- z$ l    db = database_config.get('db', ‘目标数据库’)+ v; t. c; I" K' D+ \4 Y
    return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")/ R) N+ A: I+ H; a5 C
" x5 s4 [- J: w. H4 T( f% ?
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect. {  c4 P) d% ]

1 g9 x/ w' q  S& G




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