QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4384|回复: 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
    4 T- R, Q: t2 y涉及库:pymssql、sshtunnel
    " @9 f6 }1 o8 `; f涉及数据库:SQLSERVER* d1 Z5 `( `3 K( q. X( e
    + g! Y$ ]7 i! S- I
    场景如下:4 x$ P) y) h1 R
    跳板机核心代码   def __get_ssh_connector(self):        # 远程连接
    # f" Q; s1 Q5 q; L        # 跳板机地址 端口,服务器账号,密码配置7 o/ ^1 S. L1 g' ^+ t& f+ O
            server = SSHTunnelForwarder(
    1 h  X+ g, j* V8 j+ G* ?            (
    6 S% M( u' O9 y* r5 a( ~                self.connect_config.get("ssh_host", ‘白名单服务器地址’),
    + T, o* x0 U4 h0 Z+ N5 n7 t, m                self.connect_config.get("ssh_port", 22)* ?6 ]4 p3 s5 o6 ]; f
                ),, @/ S4 l, j4 `) U: V
                ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),4 S' @  u$ @( C8 e6 k# ?
                ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
    ( p5 ~4 k, b( `! M            # 内网数据库地址和端口
    0 j( ^9 z- E. O( P            remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
    % C8 }5 L2 ~5 |- {# y        )7 \: w% Q1 `3 P8 I; E' N$ t
            server.start()7 t& B/ ?: c. v8 N2 Y% O
            return server  # 远程主机上的mssql通过ssh连接映射到本地的端口; w( L/ t: j2 D' J- P
    pymssql 连接数据库核心代码
    . m7 r5 G. i3 G0 t' [4 i6 N def get_mssql_connector(self):
    # J$ m1 J2 ]$ B3 v- o       return get_mssql_connector({9 F( j8 H* a" d. o1 Z! l! f
               "port": self.server.local_bind_port, #非常重要
    " }# ~! M# x0 ?           "username": ‘目标数据库账号’,
    + ?  @  J4 y) ]& M           "password": ‘目标数据库密码’,
    " u: E" F! {3 n9 g' P* N0 p           "db": self.connect_config.get('db', ‘目标数据库’)
    1 X9 ?# \8 N6 A( z       })+ I; T8 ?4 p0 L# H( X
    " @& t4 L2 r8 G
    def __get_mssql_connector(database_config):
    - g) ~- ~. [, J4 {" L8 `, M    host = database_config.get('host', '127.0.0.1')
    3 c1 u; V& _# X3 N  v; S5 a3 A& o    port = database_config.get('port', ‘数据库端口’)
    . p' ?* I( R- |. G7 O    user = database_config.get('username', ‘目标数据库账号’)5 q6 [, W+ r2 u: b$ h/ z( E' u' [
        passwd = database_config.get('password', ‘目标数据库密码’)
    ) l, k4 x# I5 g4 u9 y3 T    db = database_config.get('db', ‘目标数据库’)& w4 n5 Q8 K" a" G) ]8 j# D8 D: ?
        return  pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
    1 ]) J# `3 o+ t6 p+ J) N1 K
      g  Y+ l9 g0 S! k! `MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
    + P& G, L; A2 R% T! j0 y. h. S) v0 O0 Y' [& R; X$ S# p
    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-9-17 20:33 , Processed in 0.748732 second(s), 50 queries .

    回顶部