数学建模社区-数学中国
标题:
python使用sshtunnel+pymssql连接远程数据库详解
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:18
标题:
python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
% P4 z5 i; q' W5 `" p
涉及库:pymssql、sshtunnel
4 N8 N& O5 w* ]/ n6 B
涉及数据库:SQLSERVER
! Z+ d, l5 j) ^# `. o
. Q) `0 _& V' G; G' O
场景如下:
" o$ E- ]. U5 q" P
跳板机核心代码
def __get_ssh_connector(self):
# 远程连接
" Y, } ~0 a) V9 H7 ~- D
# 跳板机地址 端口,服务器账号,密码配置
3 }* O" @4 l5 T( J0 ~8 ?0 |
server = SSHTunnelForwarder(
: P$ H# i/ B, o; V" } r
(
. P# ]5 m% D- @
self.connect_config.get("ssh_host", ‘白名单服务器地址’),
9 \4 F7 u' f B7 g2 E: w
self.connect_config.get("ssh_port", 22)
2 x4 m3 c0 S9 V' [" g0 `/ g; T
),
* z9 ]: Z. L) {4 p, B" G* c
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
! j1 |3 P- Y, ^. M: }$ X! ?
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
' _- H/ L& c2 W
# 内网数据库地址和端口
" ?6 Q, }+ m" l: m' m) u% n! n
remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
! k/ K% \3 {/ p; {
)
9 I8 R. U5 v, h7 a/ r9 G. Q1 `) V/ f
server.start()
+ q* q8 n) ?; |$ R" Z
return server # 远程主机上的mssql通过ssh连接映射到本地的端口
6 |6 q+ K% Z' L, h+ ]0 o& M
pymssql 连接数据库核心代码
) C, F3 f" ?* ?" f5 X, l/ L7 a6 o
def get_mssql_connector(self):
1 o9 b, E8 }7 x+ C9 @4 i
return get_mssql_connector({
5 ^7 `, g' L& f
"port": self.server.local_bind_port, #非常重要
! M$ B7 B. L0 O9 @ F4 M* @# J7 B
"username": ‘目标数据库账号’,
9 X3 T* q4 F' h* R
"password": ‘目标数据库密码’,
) p4 ?7 L7 h& u$ T1 V' N
"db": self.connect_config.get('db', ‘目标数据库’)
R* c+ O9 X1 T7 r. s# Q
})
! w" q$ m6 u8 h' }2 _$ n% m' L& j# Q
6 ?& F. A9 m' ^$ b6 ?5 U+ C
def __get_mssql_connector(database_config):
; l4 m, k8 P$ u- O4 a# u% N
host = database_config.get('host', '127.0.0.1')
1 C4 T1 }) e2 W: Y, m
port = database_config.get('port', ‘数据库端口’)
9 @% C j1 W0 _) Z0 D$ J4 Z8 ^) v, p$ z
user = database_config.get('username', ‘目标数据库账号’)
+ d% m# C4 w8 I" e9 ~/ P/ W
passwd = database_config.get('password', ‘目标数据库密码’)
! E' n6 j, T% H5 P
db = database_config.get('db', ‘目标数据库’)
3 R+ g8 o k$ R3 r9 j9 V& M
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
_+ Z$ s; D5 n& k5 _$ O
' J- ]) D. _+ _' R; m' u
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
1 a4 C; O9 d8 ]. `2 S7 A
+ P3 T( g D7 i) l7 W# R
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5