QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4273|回复: 0
打印 上一主题 下一主题

python使用sshtunnel+pymssql连接远程数据库详解

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:18 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
    6 ~; _" P8 b  t% h涉及库:pymssql、sshtunnel
    1 z! K' x, S- c* }3 t8 J涉及数据库:SQLSERVER
    3 \1 u! l# c9 O' t: L1 q) D2 n; N/ M
    场景如下:
    ' H4 O7 r/ y, i4 e$ h跳板机核心代码   def __get_ssh_connector(self):        # 远程连接  Y- U: n+ F- P& S
            # 跳板机地址 端口,服务器账号,密码配置' }; s  H4 Y' P& v+ W
            server = SSHTunnelForwarder(: s7 B; t, j- ~& J# t
                (: I0 q) p+ _/ L* b
                    self.connect_config.get("ssh_host", ‘白名单服务器地址’),; }( P0 X8 u0 V; P+ Q8 D5 X" H# s& W
                    self.connect_config.get("ssh_port", 22)
    ' b. n8 n3 h# \1 \/ S! Q2 j            ),  y$ u, M! Y  ]' k+ f- W+ |
                ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),+ E, Z; w; p8 y% x+ F- ]
                ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
    : ~( R2 s1 J' R            # 内网数据库地址和端口# I  T* q/ T7 y4 a
                remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))0 }7 A/ X  h+ m1 C7 U
            )9 S6 ^# c2 n9 ?! v2 v4 V
            server.start()
    , o) d3 _2 ~) @9 x1 L  \* a+ X        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口7 g1 K3 K7 u8 C! n& ]
    pymssql 连接数据库核心代码
    5 F( t' B& g& a6 X) X; r9 t; J def get_mssql_connector(self):
    6 @' S1 e( k. T- ^0 |       return get_mssql_connector({2 t  p) s3 a: U. W9 Z: S
               "port": self.server.local_bind_port, #非常重要! X! b% I- u1 x. K' U
               "username": ‘目标数据库账号’,
    , c7 h+ z# M5 E3 ]: ?+ D           "password": ‘目标数据库密码’,+ w, Y. n. b+ q7 c! }
               "db": self.connect_config.get('db', ‘目标数据库’)
    ) P. ], }1 |3 X; k       })
    - Q3 a; g* U" s1 V+ d
    1 B5 L) F2 s! W! ]& J5 Z2 Zdef __get_mssql_connector(database_config):
    & B( |6 b. s& h0 z' G; n    host = database_config.get('host', '127.0.0.1')% @! B$ E6 d/ I; `" b
        port = database_config.get('port', ‘数据库端口’)
    + S$ M- q$ }6 S0 U% M5 H    user = database_config.get('username', ‘目标数据库账号’)
    2 [, Y" y2 ^- r/ }5 u* W8 `    passwd = database_config.get('password', ‘目标数据库密码’)+ G  P& u+ b# }9 D' E
        db = database_config.get('db', ‘目标数据库’)9 \- ?& j3 e7 j" t: a. D7 q
        return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")- S' f  r# z* w) k" ?4 @

    8 A" X3 w. l! m- t  }1 {' N0 eMySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect6 D. S4 t$ D: i+ F

    . D  C0 u  R- Y  i3 q: k
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-8-22 11:57 , Processed in 0.308174 second(s), 50 queries .

    回顶部