QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4941|回复: 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
    : ]- s' D1 M: K2 ~8 A# O; L( {* {涉及库:pymssql、sshtunnel- t" V2 T! _6 t
    涉及数据库:SQLSERVER
    ' d5 l! z; C1 c7 A" f' e/ y9 g0 M/ }& P% x( |
    场景如下:. ]) O) i2 q9 C/ j$ g! V$ U& `: g
    跳板机核心代码   def __get_ssh_connector(self):        # 远程连接# {$ i2 S4 h+ R8 q4 D( t$ ^8 D
            # 跳板机地址 端口,服务器账号,密码配置
    % i5 r. z) k9 J7 B4 Q: M        server = SSHTunnelForwarder(
    ; \$ L' R6 e! _; ^+ u6 n% `! n# k            (
    ! W8 t( e/ D9 G! |4 b                self.connect_config.get("ssh_host", ‘白名单服务器地址’),7 H/ F( D0 ~, q
                    self.connect_config.get("ssh_port", 22)
    $ A4 X' d. x  n! j0 Y" Q5 }            ),
      ?4 L7 x4 n) t6 C* B5 A            ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),6 G$ z" ^9 k3 @9 U! A
                ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
    ; W' i( P* {( W. x2 v            # 内网数据库地址和端口9 k2 p! H6 V; T' v# @  R
                remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
    3 _" U, K( f( k5 _0 U        )
    7 `9 m$ l: G/ C        server.start()/ T( V# c9 z5 S* i( @  i! n
            return server  # 远程主机上的mssql通过ssh连接映射到本地的端口
      j6 u, Q; i) jpymssql 连接数据库核心代码 ) W, ^7 {1 S2 T# @+ J
    def get_mssql_connector(self):
    9 v8 @* T3 g- L9 y9 R- W+ }  \7 }( d       return get_mssql_connector({8 O2 s, P" a1 @: o+ i, c# I
               "port": self.server.local_bind_port, #非常重要4 R4 x. x& C0 K8 `# p4 ]
               "username": ‘目标数据库账号’,
    / w6 [# C  D7 {# R! H) [) M3 r) f           "password": ‘目标数据库密码’,' Z1 \* j; S: K: t6 y/ Q# L/ _; M# ~
               "db": self.connect_config.get('db', ‘目标数据库’)" r. v8 e( h& f
           })
    ! [) Z. b  b: J" K% i$ n- w" p0 V% m7 F: L# y% N3 h
    def __get_mssql_connector(database_config):- O! W9 \9 j9 T) J
        host = database_config.get('host', '127.0.0.1')/ {  P% K' M- X: E% k  d2 H
        port = database_config.get('port', ‘数据库端口’)
    , N( z8 B/ m1 G/ L( I) v    user = database_config.get('username', ‘目标数据库账号’)
    ) O* k+ O( M5 A% R4 F6 E# F% L    passwd = database_config.get('password', ‘目标数据库密码’)$ V) e; [/ H  q; s
        db = database_config.get('db', ‘目标数据库’)
    7 p3 H$ h/ u5 |- o  E; t+ k2 b    return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
    ( d: o1 k# e+ L% N- E' I- U0 B, b, V. l8 u0 B5 F
    MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect+ l+ V+ o9 w/ V* C
    7 g6 h5 N8 Z! ^
    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-4-18 11:25 , Processed in 0.433342 second(s), 50 queries .

    回顶部