QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5000|回复: 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 f" T7 d9 _% E. D; I0 O+ m涉及库:pymssql、sshtunnel
    6 c+ _. t) G0 e: q& D涉及数据库:SQLSERVER" R+ u5 H3 `+ C' F7 r" W
    - c7 x/ m: B  N' @! x$ F* [
    场景如下:
    4 n4 [2 n- g) F. W跳板机核心代码   def __get_ssh_connector(self):        # 远程连接
    4 i8 @, m  N& n3 _        # 跳板机地址 端口,服务器账号,密码配置6 o' Z  W% d* |( b- |& H9 z
            server = SSHTunnelForwarder(
    ! |+ Z  y, B. l& J+ ~& o# @            (
    ' v# O! Z! W% k6 E' p                self.connect_config.get("ssh_host", ‘白名单服务器地址’),
    - O: o* e, J. O                self.connect_config.get("ssh_port", 22)
    1 }8 n7 |# e1 X- C0 r5 R            ),
    ! J$ `( r) |- C( Y& {; m. s( {& t            ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),# y9 N$ W  ?# ]' c5 U* M
                ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),2 \7 ^9 Y  t: g" `, ?# }3 Y
                # 内网数据库地址和端口
    % x+ j: n/ ~" n0 }! e            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))( y, N; ?3 f- O$ ^! v  T
            )
    0 k  k  R: X$ w# `3 v7 O        server.start()8 T- r' n8 j/ s, s
            return server  # 远程主机上的mssql通过ssh连接映射到本地的端口
    9 j& R/ z7 x( t* tpymssql 连接数据库核心代码
    3 T. M# w, @7 j# C9 \: s0 v def get_mssql_connector(self):
    ; E1 B' b' Z$ e0 h6 n0 |       return get_mssql_connector({& r; B) N' `+ q9 B$ q
               "port": self.server.local_bind_port, #非常重要
      N4 r+ j2 Q& L7 S1 L. h5 D           "username": ‘目标数据库账号’,
    2 R$ h) Q# Z" [           "password": ‘目标数据库密码’,, e) z3 n( g4 a6 h/ C$ \4 P
               "db": self.connect_config.get('db', ‘目标数据库’)9 v7 p5 B: k3 N1 L' H& H
           })' M' V/ \; d) N, O5 _2 d
    ; P5 L% V5 t" L1 u7 w
    def __get_mssql_connector(database_config):# F1 T: P% V  a# A- Z/ H
        host = database_config.get('host', '127.0.0.1')6 b5 `6 B1 c9 W% N0 R  {
        port = database_config.get('port', ‘数据库端口’)$ s% Z( c6 u- q- ?+ [
        user = database_config.get('username', ‘目标数据库账号’)  R) ?; r) K0 w* l8 i: q8 L
        passwd = database_config.get('password', ‘目标数据库密码’)
    " t& k7 V0 E# ?5 Q, z' u/ e% q    db = database_config.get('db', ‘目标数据库’). ?1 u4 ?0 F$ X% w" w+ t) J8 e9 Y
        return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
    $ Q3 H% i2 l. t1 d4 z  b" \0 z! H: V4 j0 ^' T
    MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
    : O8 [8 J4 C. k8 I" ?5 w
    ; Z$ J% }. n# k; u2 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-7-18 14:59 , Processed in 0.321041 second(s), 51 queries .

    回顶部