web-dev-qa-db-ja.com

ParamikoSSHを介したSQLAlchemy

SSH経由でアクセスする必要があるサーバー上にデータベースがあります。現在、コマンドラインを使用してデータを取得することでDBを処理しています。

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 DataFramesを直接操作できるようにする方法はありますか?

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

これを行う最も簡単な方法は、リモートホストのmysqlポートへのSSHトンネルを実行することです。

ssh -f [email protected] -L 3307:mysql1.example.com:3306 -N

次に、SQLAlchemyでローカルに接続します。

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

本当にparamikoを使用したい場合は、 paramikoリポジトリ内のこのデモコード または sshtunnel モジュールを試してください。ただし、sshコマンドが最も簡単な方法かもしれません。トンネルがダウンした場合は、 autossh を使用してトンネルを再起動できます。

8

SSH経由でリモートPostgresqlデータベースに接続することに興味があり、データをpandas DataFrameにロードしたい人がいる場合は、次の方法で行います。

次のパラメータでsshできる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()
6
Matin Kh

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>")
4

サーバーの(ホスト、ポート)を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()
1
juan Isaza