sqlalchemy和pymysql通过ssh连接远程mysql服务器

 首先需要一个模块sshtunnel,如果没有直接pip install sshtunnel

其实连个连接方式非常像:

pymysql连接方式:

import pymysql
from sshtunnel import SSHTunnelForwarder

ssh_host = ""  # 堡垒机ip地址或主机名
ssh_port = 22  # 堡垒机连接mysql服务器的端口号,一般都是22,必须是数字
ssh_user = ""  # 这是你在堡垒机上的用户名
ssh_password = ""  # 这是你在堡垒机上的用户密码
mysql_host = "localhost"  # 这是你mysql服务器的主机名或ip地址
mysql_port = 3306  # 这是你mysql服务器上的端口,3306,mysql就是3306,必须是数字
mysql_user = ""  # 这是你mysql数据库上的用户名
mysql_password = ""  # 这是你mysql数据库的密码
mysql_db = ""  # mysql服务器上的数据库名


with SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
        ssh_password=ssh_password,
        remote_bind_address=(mysql_host, mysql_port)) as server:
    conn = pymysql.connect(host=mysql_host,
                           port=server.local_bind_port,
                           user=mysql_user,
                           passwd=mysql_password,
                           db=mysql_db)

    cursor = conn.cursor()
    cursor.execute("select * from user")
    row_1 = cursor.fetchone()
    print(row_1, type(row_1))
    # 获取前n行数据
    # row_2 = cursor.fetchmany(3)
    # 获取所有数据
    # row_3 = cursor.fetchall()
    conn.commit()
    cursor.close()
    conn.close()

如果给pymysql加一个事务处理,可以看这里https://www.cnblogs.com/woider/p/5926744.html

sqlalchemy连接方式:

from sshtunnel import SSHTunnelForwarder
from sqlalchemy import Column, String, Integer, create_engine, event
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.exc import DisconnectionError

ssh_host = ""  # 堡垒机ip地址或主机名
ssh_port = 22  # 堡垒机连接mysql服务器的端口号,一般都是22,必须是数字
ssh_user = ""  # 这是你在堡垒机上的用户名
ssh_password = ""  # 这是你在堡垒机上的用户密码
mysql_host = ""  # 这是你mysql服务器的主机名或ip地址
mysql_port = 3306  # 这是你mysql服务器上的端口,3306,mysql就是3306,必须是数字
mysql_user = ""  # 这是你mysql数据库上的用户名
mysql_password = ""  # 这是你mysql数据库的密码
mysql_db = "" # mysql服务器上的数据库名

Base = declarative_base()

class Phones(Base):
    __tablename__ = 'phones'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))


def checkout_listener(dbapi_con, con_record, con_proxy):
    try:
        try:
            dbapi_con.ping(False)
        except TypeError:
            dbapi_con.ping()
    except dbapi_con.OperationalError as exc:
        if exc.args[0] in (2006, 2013, 2014, 2045, 2055):
            raise DisconnectionError()
        else:
            raise


with SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
        ssh_password=ssh_password,
        remote_bind_address=(mysql_host, mysql_port)
) as server:
    # server.start()  # ssh通道服务启动,用了with语句会自己启动
    local_port = str(server.local_bind_port)
    engine = create_engine(
        'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(mysql_user, mysql_password, '127.0.0.1', local_port,mysql_db),
        pool_size=100,
        pool_recycle=3600)

    event.listen(engine, 'checkout', checkout_listener)  # 防止报连接池相关的错误
    Base.metadata.create_all(engine)  # 检测文件中所有继承了Base类的类,在mysqld中建立所有的表,类就是表
    Session = sessionmaker(bind=engine)
    session = Session()

 

posted @ 2018-03-30 19:04  黄土地上的黑石头  阅读(2742)  评论(0编辑  收藏  举报