QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4966|回复: 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
    ( Y1 Y: e+ n$ c3 p涉及库:pymssql、sshtunnel
    ; u4 e5 t: c  \- P$ j/ W" Y涉及数据库:SQLSERVER9 N2 l% _* ]. ]9 i( K+ Z, v% g

    0 j- g& x8 t, g场景如下:: Q( F' F8 N7 D4 @- ?) D
    跳板机核心代码   def __get_ssh_connector(self):        # 远程连接
    ( X/ V. g1 X$ z' B6 h; O& W3 I        # 跳板机地址 端口,服务器账号,密码配置& ?9 u6 |. m. a% m
            server = SSHTunnelForwarder(
      ~: e( V% _  H" T( a( S            (
    8 _. z! d+ t; h$ U0 x                self.connect_config.get("ssh_host", ‘白名单服务器地址’),
    + U$ D. z- _) ^' n* u% L                self.connect_config.get("ssh_port", 22)
    * D  P  q- U3 Y/ m% y4 h            ),2 i* [: s$ B; c* C: c/ v
                ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
    2 x4 v- b8 x& P$ h6 g            ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
    , a# v* y  W1 H  x            # 内网数据库地址和端口
    $ d/ a; a: A* }+ o1 A, K& g            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’)); u$ M) e$ N* s8 Z: C
            )
    8 {  N4 E; c: B* I- V        server.start()* a) s" [+ M+ x  O
            return server  # 远程主机上的mssql通过ssh连接映射到本地的端口6 i. q! V. C- E4 b* y  \: r+ ]9 `
    pymssql 连接数据库核心代码
    ) X! ~; o* k  ^" ?$ X1 C def get_mssql_connector(self):. E0 n! l. j& L# O6 m$ O
           return get_mssql_connector({
    5 r* b4 W* b  b* ?0 p; Z           "port": self.server.local_bind_port, #非常重要
    % [! L. }  ]( `( b2 ~+ z" W           "username": ‘目标数据库账号’,
    5 ]" P  L2 b# b. r           "password": ‘目标数据库密码’,
    % B$ r  T3 L/ `           "db": self.connect_config.get('db', ‘目标数据库’)* @* i8 B" g/ g: Q2 g
           })
    % o0 m, a) r  Z
    & ^3 O+ q1 u; b, Udef __get_mssql_connector(database_config):
    6 D. U( o$ p/ I5 `; T6 O* B7 Z    host = database_config.get('host', '127.0.0.1')
    ' o* u( p$ {! P, Y  u    port = database_config.get('port', ‘数据库端口’)# j* _0 D  j4 m
        user = database_config.get('username', ‘目标数据库账号’)* b8 l/ U1 x2 m4 O$ `6 N$ \
        passwd = database_config.get('password', ‘目标数据库密码’)0 Q/ G, w  T* B) P' z# C" n# u
        db = database_config.get('db', ‘目标数据库’)8 G. A9 t8 `3 \8 z6 u; K
        return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
    1 }( T* f1 l5 G+ d7 T8 D- K' e3 r# U) a: _5 w, \
    MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
    $ m/ G: M. Y& p1 K8 g7 y6 ]9 U+ j' [+ U4 d& |/ S! H7 K
    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-2 23:50 , Processed in 0.642573 second(s), 50 queries .

    回顶部