数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:18
标题: python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。# [) x- P$ |8 d( F; m- ?* X9 h
涉及库:pymssql、sshtunnel. b0 B/ P5 J+ V2 Y
涉及数据库:SQLSERVER
4 X! Z- o7 [6 F  Q+ p6 }  ~% c  F+ V1 a0 y* h: b. T) U
场景如下:
! B" r# K" U& x- Q跳板机核心代码   def __get_ssh_connector(self):        # 远程连接( `7 A3 ]+ D, u1 U; {
        # 跳板机地址 端口,服务器账号,密码配置% T/ D6 m, g0 s) T
        server = SSHTunnelForwarder(
2 y0 X  H* ~  }- V2 @2 n            (
4 q$ B# J& p8 X% G+ c! M                self.connect_config.get("ssh_host", ‘白名单服务器地址’),2 d7 c6 N! ?- k) @' {. S( u
                self.connect_config.get("ssh_port", 22)% Q6 V2 f  K- }. P! P9 K9 _
            ),2 t2 `7 ?( b! t
            ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
! Z8 e  t% m& Z" j            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
& U9 k5 |) V( `5 e            # 内网数据库地址和端口
. R# Y! x* x% o            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))- G' @; d5 s9 m+ R( ?+ L/ x- A) P
        )! |4 R+ ~' F1 x- g
        server.start()
& v0 A) d  t; A2 ^        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口
0 ~( d/ |5 u  r; y8 u" g  \pymssql 连接数据库核心代码
* M0 R( A9 \7 @8 v def get_mssql_connector(self):- B2 |. A* n% j! l5 r, n/ e$ K, l
       return get_mssql_connector({7 h' ~; d8 ^' a: g; o* o- X/ b
           "port": self.server.local_bind_port, #非常重要- W% ^' {, k1 f/ o$ G4 c
           "username": ‘目标数据库账号’,5 C& n8 h$ Y7 D- o9 D! A' q
           "password": ‘目标数据库密码’,
4 o$ |- f5 p- R- J  ]5 v7 D: L; R           "db": self.connect_config.get('db', ‘目标数据库’)
! K" V5 \( }4 a- S4 g) E       })# {: t1 k0 u9 C/ b" u! H4 W0 ?

% E" d3 p; J9 _- tdef __get_mssql_connector(database_config):
, i+ ~$ E. N  c! `- e% ?    host = database_config.get('host', '127.0.0.1')1 {) C8 V2 h( A' `  e( W
    port = database_config.get('port', ‘数据库端口’)
0 ^2 E' P3 p5 k" I5 _+ k    user = database_config.get('username', ‘目标数据库账号’)+ u1 t, q  H8 p2 Q# H7 e, y
    passwd = database_config.get('password', ‘目标数据库密码’)2 m* C3 m9 z# x% C
    db = database_config.get('db', ‘目标数据库’)
' w7 V. |+ `4 F) Z) V9 a- ~    return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")+ I* f! Q4 @3 z8 |4 H* D* O5 N4 c
$ N7 r, _4 v3 _% \3 f8 y3 }
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect9 |7 B# Z( J5 j% t3 e

& N# U/ F2 o1 L/ v2 L0 z0 Q4 m




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