数学建模社区-数学中国
标题:
python使用sshtunnel+pymssql连接远程数据库详解
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:18
标题:
python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
) G9 D, f( d5 C& u
涉及库:pymssql、sshtunnel
9 e9 A4 r4 D* S1 v' S3 o# d' k' V
涉及数据库:SQLSERVER
8 v" u& J0 u9 \7 ?% k
% e1 d( ?) b" U+ X7 [5 m1 c! F* @+ g, ?2 Y
场景如下:
* d7 K. D" _; y& W9 g( N% D
跳板机核心代码
def __get_ssh_connector(self):
# 远程连接
% y+ `% P. V2 T# t: k, t7 ?" f
# 跳板机地址 端口,服务器账号,密码配置
- u! T( N( E0 N5 Q( _
server = SSHTunnelForwarder(
4 r' ]+ `( p k. S4 D* B% m ]
(
5 q' g) n9 J' e- l
self.connect_config.get("ssh_host", ‘白名单服务器地址’),
/ N' J* o2 G8 `. A \7 v$ |$ `( q( Q
self.connect_config.get("ssh_port", 22)
; F; j, U1 @" E
),
! M: m+ N2 C0 p' e# \5 {/ L% P4 k2 c
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
$ v# V2 V) L2 r; F2 W
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
3 x( [' M, Q9 d
# 内网数据库地址和端口
% _3 u* m1 Q( I' C9 G, v. {
remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
: z6 G+ A9 u. o
)
0 d+ m" e2 I, d8 }5 _! s: ~- z! h
server.start()
) G9 D' Z0 L/ s
return server # 远程主机上的mssql通过ssh连接映射到本地的端口
1 W I4 b& M) G" C/ D, Y D
pymssql 连接数据库核心代码
! e k9 g$ u1 p6 F- e
def get_mssql_connector(self):
5 m) J$ l2 y: i0 D# j! ]4 o( N) A
return get_mssql_connector({
/ i1 _* M X6 e) [# s
"port": self.server.local_bind_port, #非常重要
8 U t/ q0 v: n3 x- }6 A) r9 T
"username": ‘目标数据库账号’,
/ g/ S3 `4 H1 g" C: C6 S' q8 E/ N
"password": ‘目标数据库密码’,
7 @3 } ?+ O- M2 y$ {& M
"db": self.connect_config.get('db', ‘目标数据库’)
; d3 d' ^5 I, W" G
})
$ m7 W. Y9 p* H' s- B
% x% B) l4 X1 {
def __get_mssql_connector(database_config):
, r* r, C8 h2 r. g) v5 H5 u' s
host = database_config.get('host', '127.0.0.1')
4 o* h# b6 L3 ~0 V9 y* w
port = database_config.get('port', ‘数据库端口’)
* O, t' t* C) U3 \4 Q% K }
user = database_config.get('username', ‘目标数据库账号’)
/ C- P$ D; N' ^5 V
passwd = database_config.get('password', ‘目标数据库密码’)
1 z6 }6 X& f" z7 L, J$ P# E) n' @6 x
db = database_config.get('db', ‘目标数据库’)
5 I! B7 k* X" l% ]( t3 S
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
1 `/ I) Q' f+ J1 d3 V
2 Q, {4 c, ?! ]3 J$ F
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
/ z0 x9 I5 t; j9 D' ~
' R$ P9 K }. Y
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5