QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4058|回复: 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
    ' J0 P8 z2 i, v8 }" V& l5 `涉及库:pymssql、sshtunnel
    8 d# r# f) S5 D- I6 ~涉及数据库:SQLSERVER- X# K- m# r! @% e
    - j, g# I5 q! o6 `
    场景如下:: i! l7 f+ X1 k; k) x; F& b1 }
    跳板机核心代码   def __get_ssh_connector(self):        # 远程连接1 }2 d9 k' a6 u4 y7 B, I- a0 h
            # 跳板机地址 端口,服务器账号,密码配置
    ! y0 _+ m0 T; |- m        server = SSHTunnelForwarder(
    % i' n4 t' c: K- `! `" a            (7 Q) i# T2 w  Y/ g
                    self.connect_config.get("ssh_host", ‘白名单服务器地址’),% x" o; J0 ~; V; R' F
                    self.connect_config.get("ssh_port", 22)5 v: E$ e  T0 @# [  m( \5 f
                ),5 ]8 P5 ^$ K  q2 t7 \
                ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
    2 P! x6 L% q1 M9 u! K5 V7 s1 j! M5 v            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
    : R( r# I9 s: {3 _            # 内网数据库地址和端口* T  P& m. ^& G. g
                remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’)). z/ g, t/ M) O8 f  a
            )
    & l/ t+ h( L) I        server.start()
    & y4 N3 E' @1 x; |8 G! R        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口
    2 Y) v: T2 [/ T3 p$ h$ epymssql 连接数据库核心代码
    + L! o+ v  t, R- Q, q" m/ q* P; n def get_mssql_connector(self):
    - H4 c( U' {, h( o6 X       return get_mssql_connector({
    8 {+ l! ]3 c' d- P           "port": self.server.local_bind_port, #非常重要
    8 w% \' _* g- |4 U; }; a/ ^           "username": ‘目标数据库账号’,) f3 l- U  L- O* ~$ F5 C
               "password": ‘目标数据库密码’,
    ( h/ S7 L9 }: @; e2 l) F           "db": self.connect_config.get('db', ‘目标数据库’)
    3 @1 v8 ?" [! N) m) D       })
    9 |3 L3 G1 b( m5 \- u4 ^$ n5 I1 p# I; ~1 S6 e5 c5 l3 e
    def __get_mssql_connector(database_config):
    , a5 Z- w+ o3 X8 `# d    host = database_config.get('host', '127.0.0.1')
    2 g  }9 I6 w4 {% T* D7 T8 G! L    port = database_config.get('port', ‘数据库端口’)
    : j. @7 W7 t, w) M3 l! E3 f    user = database_config.get('username', ‘目标数据库账号’)- ?4 `. W4 }% K
        passwd = database_config.get('password', ‘目标数据库密码’)
    , D  _5 e) A* V+ V8 E; o& r$ e    db = database_config.get('db', ‘目标数据库’)0 H" ~  i9 {+ _
        return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
    / ^; ^2 C  X7 H1 w, y" M2 k( Q. c+ s+ V5 x* n
    MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
    # j1 [( I; t8 z2 i; b9 z; X2 R( ]/ m2 F. b( C; }/ r
    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-7-24 19:14 , Processed in 1.197718 second(s), 50 queries .

    回顶部