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")
これを行う最も簡単な方法は、リモートホストの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 を使用してトンネルを再起動できます。
SSH経由でリモートPostgresqlデータベースに接続することに興味があり、データをpandas DataFrameにロードしたい人がいる場合は、次の方法で行います。
次のパラメータでsshできるpostgresqlデータベースをリモートサーバーにインストールしたとします。
SSHパラメータ:
10.0.0.101
22
(SSHのデフォルトポート)my_username
my_password
データベースパラメータ:
5432
(postgresqlのデフォルトポート)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()
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>")
サーバーの(ホスト、ポート)を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()