通过Paramiko SSH实现SQLAlchemy

2024-06-12 01:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在服务器上有一个数据库,需要通过SSH访问。现在,我通过使用命令行获取数据来处理数据库。

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='XX.XX.XX', username='user', password='pass', port = YYY)
query = "mysql -u " + username_sql + " -p" + password_sql +" dbb -e \"" + sql_query + "\""
ssh.exec_command(query.decode('string_escape'))
ssh.close()

有没有一种方法可以使用SQLAlchemy来提高效率,这样我就可以直接使用pandas数据帧?

from sqlalchemy import create_engine
engine = create_engine(
       "mysql://username_sql:password_sql@localhost/dbb")

Tags: import服务器数据库paramikosqlcreatemysqlusername
3条回答

最简单的方法是在远程主机上运行到mysql端口的SSH隧道。For example

ssh -f user@XX.XX.XX.XX -L 3307:mysql1.example.com:3306 -N

然后使用SQLAlchemy本地连接:

engine = create_engine("mysql://username_sql:password_sql@localhost:3307/dbb")

如果您真的想使用paramiko,请尝试this demo code in the paramiko reposshtunnel模块。但是,ssh命令可能是最简单的方法。。如果隧道关闭,您可以使用autossh重新启动它。

您可以使用SSHTunnel库,如下所示:

from sshtunnel import SSHTunnelForwarder #Run pip install sshtunnel
from sqlalchemy.orm import sessionmaker #Run pip install sqlalchemy

with SSHTunnelForwarder(
    ('10.160.1.24', 22), #Remote server IP and SSH port
    ssh_username = "<usr>",
    ssh_password = "<pwd>",
    remote_bind_address=('127.0.0.1', 5432)
    ) as server:

    server.start() #start ssh sever
    print 'Server connected via SSH'

    #connect to PostgreSQL
    local_port = str(server.local_bind_port)
    engine = create_engine('postgresql://<db_user>:<db_pwd>@127.0.0.1:' + local_port +'/<db_name>')

    Session = sessionmaker(bind=engine)
    session = Session()

    print 'Database session created'

    #test data retrieval
    test = session.execute("SELECT * FROM <table_name>")

如果有人想通过SSH连接到远程的Postgresql数据库,并想将数据加载到pandas数据框中,那么下面是如何做到的。

假设我们在远程服务器上安装了一个postgresql数据库,可以通过以下参数对其进行ssh。

SSH参数:

  • 服务器的ip:10.0.0.101
  • SSH端口:22SSH的默认端口)
  • 用户名:my_username
  • 密码:my_password

数据库参数:

  • 端口:5432postgresql默认端口
  • 数据库名称:db
  • 数据库用户:postgres_user默认用户名是postgres
  • 数据库密码:postgres_pswd默认密码为空字符串
  • 我们的数据表:MY_TABLE

现在,我们要连接到我们端的这个数据库,并将数据加载到pandas数据框中:

from sshtunnel import SSHTunnelForwarder
from sqlalchemy import create_engine
import pandas as pd

server = SSHTunnelForwarder(
    ('10.0.0.101', 22),
    ssh_username="my_username",
    ssh_password="my_password",
    remote_bind_address=('127.0.0.1', 5432)
    )

server.start()
local_port = str(server.local_bind_port)
engine = create_engine('postgresql://{}:{}@{}:{}/{}'.format("postgres_user", "postgres_pswd", "127.0.0.1", local_port, "db"))

dataDF = pd.read_sql("SELECT * FROM \"{}\";".format("MY_TABLE"), engine)

server.stop()

相关问题 更多 >