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)
最简单的方法是运行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 repo或sshtunnel模块中尝试此演示代码.该ssh命令可能是最简单的方法..并且如果它发生故障,您可以使用autossh重新启动隧道.
只需将服务器的(主机,端口)与 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)
您可以按如下方式使用 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)
如果有人对通过SSH 连接到远程Postgresql数据库感兴趣,并且想将数据加载到pandas DataFrame中,那么这里是如何做到的。
假设我们已经在远程服务器上安装了一个postgresql数据库,可以通过以下参数将其连接到该数据库。
SSH参数:
10.0.0.10122(SSH的默认端口)my_usernamemy_password数据库参数:
5432(PostgreSQL的默认端口)dbpostgres_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)