2015-07-19 3 views
2

У меня есть база данных на сервере, который мне нужен для доступа через 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() 

Есть ли способ сделать это с SQLAlchemy, чтобы быть более эффективными и поэтому я могу работать с пандами DataFrames напрямую?

from sqlalchemy import create_engine 
engine = create_engine(
     "mysql://username_sql:[email protected]/dbb") 

ответ

4

Самый простой способ сделать это - запустить туннель SSH для порта mysql на удаленном хосте. For example:

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

Затем подключить локально с SQLAlchemy:

engine = create_engine("mysql://username_sql:[email protected]:3307/dbb") 

Если вы действительно хотите использовать paramiko, попробуйте this demo code in the paramiko repo или sshtunnel модуль. Команда ssh может быть самым простым способом, хотя ... и вы можете использовать autossh для перезапуска туннеля, если он опустится.

3

Вы можете использовать библиотеку 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>") 
0

Просто поменять (хост, порт) сервера с 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() 
0

В случае, если есть кто-то, кто заинтересован в подключении к удаленному Postgresql база данных через SSH и хочет загрузить данные в pandas DataFrame вот как это сделать.

Предположим, мы установили базу данных postgresql на удаленном сервере, к которой мы можем использовать ssh по следующим параметрам.

параметры SSH:

  • IP Сервера: 10.0.0.101
  • SSH порт: 22 (по умолчанию порт для SSH)
  • Имя пользователя: my_username
  • Пароль: my_password

Параметры базы данных:

  • Порт: 5432 (PostgreSQL по умолчанию порт) имя
  • База данных: db
  • Пользователь базы данных: postgres_user (по умолчанию имя пользователя является postgres) пароль
  • базы данных : postgres_pswd (пароль по умолчанию i S пустая строка)
  • таблицы с нашими данными: MY_TABLE

Теперь мы хотим, чтобы подключиться к этой базе данных на наших данных конечных и нагрузок в панде 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() 
Смежные вопросы