数学建模社区-数学中国
标题:
python使用sshtunnel+pymssql连接远程数据库详解
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:18
标题:
python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
# ?$ N1 d- h2 {* |0 J4 P! l* u
涉及库:pymssql、sshtunnel
% m" n% O- l# Z+ J. M3 ~# C y5 ?
涉及数据库:SQLSERVER
: T; Z0 W& M% h; R1 g
( L4 J( D- _/ k
场景如下:
7 Z! n. j. y; X) J% \: E o5 c
跳板机核心代码
def __get_ssh_connector(self):
# 远程连接
- A6 b, h! ]" o! p1 t8 N% f
# 跳板机地址 端口,服务器账号,密码配置
* w4 K* L" O) P Q
server = SSHTunnelForwarder(
2 C! Z5 A/ t! U' k/ W8 b. [+ c T
(
$ R/ G" J& b% p" k& B
self.connect_config.get("ssh_host", ‘白名单服务器地址’),
5 ?- o! M& g: _% b. N3 e: l, M) N
self.connect_config.get("ssh_port", 22)
8 e E. s: i* B
),
" ~5 j8 A2 f7 m8 P& U5 {
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
1 X. v$ T/ N: W
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
; p3 I) t( ]2 h
# 内网数据库地址和端口
8 I0 x! P+ ]3 y1 I
remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
3 ^4 H: O% [2 d2 B, A2 G
)
* B1 }9 t& N# E" q5 b
server.start()
8 U! ?" J, w+ F( J
return server # 远程主机上的mssql通过ssh连接映射到本地的端口
! H4 Z: g6 C6 [
pymssql 连接数据库核心代码
3 X+ p. J$ `" A' V( l
def get_mssql_connector(self):
* ]4 |% i0 W J9 }0 t
return get_mssql_connector({
- |9 m) h+ x& i8 G b! X' w: g" n
"port": self.server.local_bind_port, #非常重要
, t3 Y* o/ D6 [! I% v3 q, \' O
"username": ‘目标数据库账号’,
- n+ T l& f" Z. `0 S3 D# A& z4 S
"password": ‘目标数据库密码’,
0 O1 S* H; O8 b6 g5 f" R9 \" k
"db": self.connect_config.get('db', ‘目标数据库’)
6 K; j" E& l% I2 g$ ]
})
4 N+ f7 `7 c8 a/ h- `+ E; x1 g
' ^" ?7 B# l- }' I/ {
def __get_mssql_connector(database_config):
( T; e% _: L+ A* ~1 \% m
host = database_config.get('host', '127.0.0.1')
8 Q/ Q6 s3 L* ^( r, E% X5 O
port = database_config.get('port', ‘数据库端口’)
* S( }3 ]% ?6 n! T
user = database_config.get('username', ‘目标数据库账号’)
; a# d+ l8 [2 B$ B2 n
passwd = database_config.get('password', ‘目标数据库密码’)
5 u; X0 y2 h% L/ H* d3 O0 z
db = database_config.get('db', ‘目标数据库’)
j/ i. z m$ q4 m
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
0 v+ q/ g8 j% l5 Q, a7 |
* \/ U! u0 ^" h* `5 g) Q! H: H
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
6 r: K+ T* J5 k5 Q) G
W* R0 c0 l/ t% t" T+ {
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5