QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5004|回复: 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
    4 y* q6 N, v: j' }: Y, Y涉及库:pymssql、sshtunnel8 `9 D$ n/ b4 U% A1 s- ~7 t& G
    涉及数据库:SQLSERVER
    ' P9 q, ?9 u7 _3 Q' Q* D* B, ?( ?& ^( m
    场景如下:
    6 O0 D% a/ p  g$ r6 Y, X跳板机核心代码   def __get_ssh_connector(self):        # 远程连接
    9 e" ^1 }6 W/ W1 |( p        # 跳板机地址 端口,服务器账号,密码配置
    / l7 f# q3 ?/ T7 r6 f        server = SSHTunnelForwarder(
    ' F/ e, e5 O$ T/ p2 ]" h            (
      b2 q* f3 `4 p; F                self.connect_config.get("ssh_host", ‘白名单服务器地址’),2 C6 n8 s4 n5 s5 n! x
                    self.connect_config.get("ssh_port", 22)
    7 I/ u6 {  z/ i: W: g0 p+ k3 v            ),) n  o& V" ]0 J9 V( ?" K+ e8 t
                ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
    . q* F0 k" ^: N1 r9 B& v! g) [: e            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),% x$ o/ Y9 w4 q) U' K
                # 内网数据库地址和端口
    : M2 H0 [' {& S8 R+ B            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))6 W8 k9 A; u6 [$ [  S( J$ u& Q
            )* o, k+ m' J1 ]! d' B
            server.start()4 K! M5 ~) x7 F7 M3 \) H! M
            return server  # 远程主机上的mssql通过ssh连接映射到本地的端口( ]- L$ n! R7 s* g; {4 _
    pymssql 连接数据库核心代码 3 |% }- `8 p; s, I  x
    def get_mssql_connector(self):
    ! ^5 u* G! u2 y6 J# h' K" C( B* b       return get_mssql_connector({4 T: q+ ]- z2 u
               "port": self.server.local_bind_port, #非常重要9 m. q7 ?) c$ e1 S" g
               "username": ‘目标数据库账号’,; x" G. O7 o5 ?) H, s' w5 _
               "password": ‘目标数据库密码’,* T* r# `; d+ Q" [' I
               "db": self.connect_config.get('db', ‘目标数据库’): j8 J( @* q6 t- E( S# N9 a6 p9 R
           })
    ' {6 n) F# j% M* _2 C! G) G6 O1 h7 |# Y- k5 T
    def __get_mssql_connector(database_config):! B0 w. B( T- p8 J' X
        host = database_config.get('host', '127.0.0.1')
    . D( s# F) F  w    port = database_config.get('port', ‘数据库端口’)
    : g3 p, R) g% O, Z5 I9 q0 V    user = database_config.get('username', ‘目标数据库账号’)
    % I6 ?8 A+ E% D5 l5 z& T    passwd = database_config.get('password', ‘目标数据库密码’)
    3 h0 E& O, q4 d5 D' \    db = database_config.get('db', ‘目标数据库’): v. H* [, S  l
        return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
    , Q* t2 Z1 W# {1 P8 [- L/ u: f& n  ?) _
    MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
    , i- J3 w$ B* N9 [/ D
    ! s% g: f# l' ~' P4 \1 J. V
    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, 2026-7-20 04:45 , Processed in 0.326742 second(s), 51 queries .

    回顶部