QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4968|回复: 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。3 x6 o: r5 f* S/ ?; F& K
    涉及库:pymssql、sshtunnel
    $ I# Z* q. Q' M% Q2 [涉及数据库:SQLSERVER
    & Y3 f( U8 d: I/ n) O
    % L* i, ]' V# q  V场景如下:
    + B; _0 S( Z8 g7 g! j, h7 [跳板机核心代码   def __get_ssh_connector(self):        # 远程连接  P, s& W/ Z2 t8 _+ m% D
            # 跳板机地址 端口,服务器账号,密码配置
    3 c5 q  ?( g. \1 F        server = SSHTunnelForwarder(- X3 a; @% S# e# D! Z  Z5 J, B4 ^6 ]7 T
                (
    9 C3 j2 M7 s7 H9 O: e/ s/ D                self.connect_config.get("ssh_host", ‘白名单服务器地址’),
    " Y* J0 J* u7 [                self.connect_config.get("ssh_port", 22)4 f- D- u% O5 R! C( o
                ),/ i3 z/ l0 d& s) e4 K" o
                ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
    ! K1 W7 ]. ^1 C: y- d. {& Z3 @/ g9 n            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),5 c5 @) x( b* T" g8 [3 D
                # 内网数据库地址和端口
    * G  n& `, m3 O+ |0 M9 E( b3 ~            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
    - L' u  ~; K& n2 B: _/ a        )
    * `, C5 |  f3 y0 A5 d% e        server.start()
    + b5 v/ k/ N8 t# y: N        return server  # 远程主机上的mssql通过ssh连接映射到本地的端口0 a( @, g! p5 s; g: r9 I8 w4 J3 R
    pymssql 连接数据库核心代码
    ' f) t$ _+ r# S: Y, X2 k6 L$ T def get_mssql_connector(self):# J; w# x$ F$ E# d% h, {1 L  `
           return get_mssql_connector({
    - j3 f+ z8 j& Y0 e           "port": self.server.local_bind_port, #非常重要; c4 }( h* r+ `6 x" c5 q5 r" y
               "username": ‘目标数据库账号’,/ B  j: J: Z7 ^7 T  i3 @$ L# r; W
               "password": ‘目标数据库密码’,
    9 F: ]3 b9 N3 q0 l  R* c           "db": self.connect_config.get('db', ‘目标数据库’)
      P5 L& U2 j: k1 D5 S       })
      s( M3 ]+ w: R" N6 u+ L, b* o( C2 y; r: q2 ^, b( g1 D! c1 G0 s9 u
    def __get_mssql_connector(database_config):
    4 C+ ~4 b  E3 v* d) _    host = database_config.get('host', '127.0.0.1')
    5 K& ]* l* A- j( E    port = database_config.get('port', ‘数据库端口’)
    4 b5 o& A3 ?1 q+ Q    user = database_config.get('username', ‘目标数据库账号’)7 ^  h* k: |' {: C, J# |6 l9 c* U- x
        passwd = database_config.get('password', ‘目标数据库密码’)
    , c5 s  i  s; F" Z" H. }0 g    db = database_config.get('db', ‘目标数据库’)+ M5 U( J+ D- l1 `+ Q+ \
        return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8"); F+ C1 o3 G: p5 I
    ; Q7 ]. _) v- g; ?# W" B5 s+ p; {5 T
    MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
    * X% s( f4 J5 X3 ^- j( t) Y4 b- S0 q- u5 D) u& t
    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-6-3 01:01 , Processed in 0.312938 second(s), 50 queries .

    回顶部