数学建模社区-数学中国
标题:
python使用sshtunnel+pymssql连接远程数据库详解
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:18
标题:
python使用sshtunnel+pymssql连接远程数据库详解
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
# [) x- P$ |8 d( F; m- ?* X9 h
涉及库:pymssql、sshtunnel
. b0 B/ P5 J+ V2 Y
涉及数据库:SQLSERVER
4 X! Z- o7 [6 F Q+ p6 } ~% c
F+ V1 a0 y* h: b. T) U
场景如下:
! B" r# K" U& x- Q
跳板机核心代码
def __get_ssh_connector(self):
# 远程连接
( `7 A3 ]+ D, u1 U; {
# 跳板机地址 端口,服务器账号,密码配置
% T/ D6 m, g0 s) T
server = SSHTunnelForwarder(
2 y0 X H* ~ }- V2 @2 n
(
4 q$ B# J& p8 X% G+ c! M
self.connect_config.get("ssh_host", ‘白名单服务器地址’),
2 d7 c6 N! ?- k) @' {. S( u
self.connect_config.get("ssh_port", 22)
% Q6 V2 f K- }. P! P9 K9 _
),
2 t2 `7 ?( b! t
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
! Z8 e t% m& Z" j
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
& U9 k5 |) V( `5 e
# 内网数据库地址和端口
. R# Y! x* x% o
remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
- G' @; d5 s9 m+ R( ?+ L/ x- A) P
)
! |4 R+ ~' F1 x- g
server.start()
& v0 A) d t; A2 ^
return server # 远程主机上的mssql通过ssh连接映射到本地的端口
0 ~( d/ |5 u r; y8 u" g \
pymssql 连接数据库核心代码
* M0 R( A9 \7 @8 v
def get_mssql_connector(self):
- B2 |. A* n% j! l5 r, n/ e$ K, l
return get_mssql_connector({
7 h' ~; d8 ^' a: g; o* o- X/ b
"port": self.server.local_bind_port, #非常重要
- W% ^' {, k1 f/ o$ G4 c
"username": ‘目标数据库账号’,
5 C& n8 h$ Y7 D- o9 D! A' q
"password": ‘目标数据库密码’,
4 o$ |- f5 p- R- J ]5 v7 D: L; R
"db": self.connect_config.get('db', ‘目标数据库’)
! K" V5 \( }4 a- S4 g) E
})
# {: t1 k0 u9 C/ b" u! H4 W0 ?
% E" d3 p; J9 _- t
def __get_mssql_connector(database_config):
, i+ ~$ E. N c! `- e% ?
host = database_config.get('host', '127.0.0.1')
1 {) C8 V2 h( A' ` e( W
port = database_config.get('port', ‘数据库端口’)
0 ^2 E' P3 p5 k" I5 _+ k
user = database_config.get('username', ‘目标数据库账号’)
+ u1 t, q H8 p2 Q# H7 e, y
passwd = database_config.get('password', ‘目标数据库密码’)
2 m* C3 m9 z# x% C
db = database_config.get('db', ‘目标数据库’)
' w7 V. |+ `4 F) Z) V9 a- ~
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
+ I* f! Q4 @3 z8 |4 H* D* O5 N4 c
$ N7 r, _4 v3 _% \3 f8 y3 }
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
9 |7 B# Z( J5 j% t3 e
& N# U/ F2 o1 L/ v2 L0 z0 Q4 m
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5