SQLAlchemy通过Paramiko SSH

Ale*_*s G 6 python mysql ssh sqlalchemy paramiko

我在服务器上有一个数据库,我需要通过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()
Run Code Online (Sandbox Code Playgroud)

有没有办法用SQLAlchemy来提高效率,所以我可以直接使用pandas DataFrames?

from sqlalchemy import create_engine
engine = create_engine(
       "mysql://username_sql:password_sql@localhost/dbb")
Run Code Online (Sandbox Code Playgroud)

Ste*_*lla 8

最简单的方法是运行SSH隧道到远程主机上的mysql端口.例如:

ssh -f user@XX.XX.XX.XX -L 3307:mysql1.example.com:3306 -N
Run Code Online (Sandbox Code Playgroud)

然后在本地连接SQLAlchemy:

engine = create_engine("mysql://username_sql:password_sql@localhost:3307/dbb")
Run Code Online (Sandbox Code Playgroud)

如果您真的想使用paramiko,请在paramiko reposshtunnel模块中尝试此演示代码.该ssh命令可能是最简单的方法..并且如果它发生故障,您可以使用autossh重新启动隧道.


jua*_*aza 7

只需将服务器的(主机,端口)与 postgres 交换即可:

from sshtunnel import SSHTunnelForwarder #Run pip install sshtunnel

server = SSHTunnelForwarder(
    (<'your host'>, <host port>),
    ssh_username=<"os remote username">,
    ssh_pkey=<'path/to/key.pem'>,  # or ssh_password.
    remote_bind_address=(<'postgres db host'>, <'postgres db port'>))

server.start()

connection_data = 'postgresql://{user}:{password}@{host}:{port}/{db}'.format(user=<'postgres user'>,
                                                                             password=<'postgres password'>,
                                                                             host=server.local_bind_host,
                                                                             port=server.local_bind_port,
                                                                             db=<'postgres db name'>)

engine = create_engine(connection_data)

# Do your queries

server.stop()
Run Code Online (Sandbox Code Playgroud)


Pra*_*ani 6

您可以按如下方式使用 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>")
Run Code Online (Sandbox Code Playgroud)


Mat*_* Kh 6

如果有人对通过SSH 连接到远程Postgresql数据库感兴趣,并且想将数据加载到pandas DataFrame中,那么这里是如何做到的。

假设我们已经在远程服务器上安装了一个postgresql数据库,可以通过以下参数将其连接到该数据库。

SSH参数:

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

数据库参数:

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

现在,我们要连接到该数据库并将数据加载到pandas DataFrame中:

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()
Run Code Online (Sandbox Code Playgroud)

  • 这帮助了我很多,谢谢。 (2认同)