【发布时间】:2022-01-17 22:49:53
【问题描述】:
是否有 python 本地方式通过 ssh 隧道将 django 连接到数据库?我见过有人在主机中使用 ssh 端口转发,但我更喜欢可以轻松容器化的解决方案。
【问题讨论】:
标签: python django ssh-tunnel
是否有 python 本地方式通过 ssh 隧道将 django 连接到数据库?我见过有人在主机中使用 ssh 端口转发,但我更喜欢可以轻松容器化的解决方案。
【问题讨论】:
标签: python django ssh-tunnel
它非常无缝。
要求:
sshtunnel 包https://github.com/pahaz/sshtunnel
settings.py 的 django DB 设置块之前创建一个 ssh 隧道:# Connect to a server using the ssh keys. See the sshtunnel documentation for using password authentication
ssh_tunnel = SSHTunnelForwarder(
SERVER_IP,
ssh_private_key=PATH_TO_SSH_PRIVATE_KEY,
ssh_private_key_password=SSH_PRIVATE_KEY_PASSWORD,
ssh_username=SSH_USERNAME,
remote_bind_address=('localhost', LOCAL_DB_PORT_ON_THE_SERVER),
)
ssh_tunnel.start()
settings.py 中添加DB 信息块。在这里,我添加了一个默认的本地数据库和我们使用 ssh 隧道连接到的远程数据库DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': NORMAL_DB_HOST,
'PORT': NORMAL_DB_PORT,
'NAME': NORMAL_DB_NAME,
'USER': NORMAL_DB_USER,
'PASSWORD': NORMAL_DB_PASSWORD,
},
'shhtunnel_db': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': 'localhost',
'PORT': ssh_tunnel.local_bind_port,
'NAME': REMOTE_DB_DB_NAME,
'USER': REMOTE_DB_USERNAME,
'PASSWORD': REMOTE_DB_PASSWORD,
},
}
就是这样。现在可以使用$ python manage.py migrate --database=shhtunnel_db 之类的命令迁移到远程数据库,或者使用Models.objects.all().using('shhtunnel_db') 之类的行从python 代码中调用数据库
额外: 就我而言,远程数据库是由其他人创建的,我只想阅读它。为了避免编写模型和停用模型管理器,我使用以下 django 命令从数据库 [src] 中获取模型:
python manage.py inspectdb
【讨论】:
default DB 连接的示例?我想使用 SSH 隧道将 Django 的 default DB 连接到远程 DB。
default 键下使用ssh隧道数据库配置会按预期工作