SQLAlchemy和sshtunnel介绍

SQLAlchemy

SQLAlchemy 是一个开源的 Python SQL 工具包和对象关系映射器 (ORM)。 它为应用程序开发人员提供了 SQL 的全部功能和灵活性。 简单来说,它允许开发者使用 Pythonic 的领域语言来访问和管理 SQL 数据库,而不是直接编写 SQL 查询语句。

核心功能:

  • ORM (Object Relational Mapper): 这是 SQLAlchemy 最著名的功能之一。 它允许您将 Python 类(模型)映射到数据库中的表。 这样,您就可以通过操作 Python 对象来间接地操作数据库表,实现了对象模型和数据库模式的解耦。
  • SQL Expression Language (Core): SQLAlchemy Core 提供了一套丰富的 API,用于以编程方式构建 SQL 查询。 即使您不使用 ORM,也可以利用 Core 来编写更灵活、更强大的数据库查询,同时还能兼容多种数据库后端。
  • 数据库无关性: SQLAlchemy 支持多种数据库后端,例如 SQLite、MySQL、PostgreSQL 等。 这意味着您可以在不同的数据库之间切换,而只需对代码进行最小的改动。
  • 连接池和事务管理: 它提供了健壮的工具来管理数据库连接池和处理事务。

简单用法 (以 ORM 为例):

以下是一个简单的 SQLAlchemy ORM 使用流程:

  1. 安装:

    bash

    pip install sqlalchemy
    
  2. 定义模型: 使用 Python 类来定义数据库表的结构。

    python

    from sqlalchemy import create_engine, Column, Integer, String
    from sqlalchemy.orm import declarative_base, sessionmaker
    
    # 创建一个基础类
    Base = declarative_base()
    
    # 定义一个 User 模型,映射到 'users' 表
    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String)
        fullname = Column(String)
    
        def __repr__(self):
           return f"<User(name='{self.name}', fullname='{self.fullname}')>"
    
    sqlalchemy.org
  3. 创建引擎和会话: 引擎 (Engine) 负责与数据库建立连接,会话 (Session) 则用于管理对象的持久化。sqlalchemy.org+1

    python

    # 创建一个连接到内存中 SQLite 数据库的引擎
    engine = create_engine('sqlite:///:memory:')
    
    # 在数据库中创建所有定义的表
    Base.metadata.create_all(engine)
    
    # 创建一个会话类
    Session = sessionmaker(bind=engine)
    session = Session()
    
  4. 添加和查询数据: 通过会话来添加和查询对象。

    python

    # 创建一个新的 User 对象
    new_user = User(name='john', fullname='John Doe')
    session.add(new_user)
    session.commit() # 提交事务
    
    # 查询所有用户
    all_users = session.query(User).all()
    for user in all_users:
        print(user)
    
    # 按条件查询
    user_by_name = session.query(User).filter_by(name='john').first()
    print(user_by_name)
    

sshtunnel

sshtunnel 是一个 Python 库,用于通过 SSH 连接创建隧道。 SSH 隧道是一种通过加密的 SSH 连接来传输任意网络数据的方法。 它可以用来为旧版应用程序添加加密功能,或者用于实现 VPN 和跨防火墙访问内部网服务。

核心功能:

  • 端口转发: 这是 sshtunnel 的核心功能。它允许您将本地计算机上的一个端口(本地端口)的连接,通过安全的 SSH 通道转发到远程服务器上的另一个端口(远程端口)。
  • 访问受限资源: 如果某个网络服务(例如数据库)只允许在服务器本地访问,您可以使用 sshtunnel 创建一个安全的隧道,从您的本地计算机访问该服务。
  • 安全性: 所有通过 SSH 隧道传输的数据都是加密的,可以防止在传输过程中被窃听或拦截。

简单用法:

以下是一个使用 sshtunnel 连接到远程 MySQL 数据库的简单示例:

  1. 安装:

    bash

    pip install sshtunnel
    
  2. 创建 SSH 隧道: 假设您有一个远程服务器,上面运行着一个只允许本地连接的 MySQL 服务。您可以使用 sshtunnel 在本地创建一个端口,将所有到该端口的连接都转发到远程服务器的 MySQL 端口。

    python

    from sshtunnel import SSHTunnelForwarder
    import pymysql # 假设使用 pymysql 连接 MySQL
    
    # 远程 SSH 服务器的信息
    SSH_HOST = 'your_ssh_host'
    SSH_USER = 'your_ssh_user'
    SSH_PASSWORD = 'your_ssh_password' # 或使用密钥
    
    # 远程 MySQL 服务器的信息 (从 SSH 服务器的角度看)
    REMOTE_DB_HOST = '127.0.0.1'
    REMOTE_DB_PORT = 3306
    
    with SSHTunnelForwarder(
        (SSH_HOST, 22), # SSH 服务器地址和端口
        ssh_username=SSH_USER,
        ssh_password=SSH_PASSWORD,
        remote_bind_address=(REMOTE_DB_HOST, REMOTE_DB_PORT)
    ) as server:
        # server.local_bind_port 是本地绑定的端口
        local_port = server.local_bind_port
        print(f"本地端口 {local_port} 已通过 SSH 隧道连接到远程 MySQL。")
    
        # 现在可以使用本地端口连接到远程数据库
        try:
            connection = pymysql.connect(
                host='127.0.0.1',
                port=local_port,
                user='your_db_user',
                password='your_db_password',
                database='your_db_name'
            )
            print("成功连接到数据库!")
            # 在这里执行数据库操作...
            connection.close()
        except Exception as e:
            print(f"数据库连接失败: {e}")
    
    print("SSH 隧道已关闭。")
(venv) gapinyc@DESKTOP-9QS7RL5:~/superset$ cat requirements.txt aiohappyeyeballs==2.6.1 aiohttp==3.13.1 aiosignal==1.4.0 alembic==1.17.0 amqp==5.3.1 -e git+ssh://git@github.com/apache/superset.git@465e2a9631994892cf399d13dd926c56cecd58ca#egg=apache_superset apispec==6.8.4 apsw==3.50.4.0 async-timeout==5.0.1 attrs==25.4.0 babel==2.17.0 backoff==2.2.1 backports-datetime-fromisoformat==2.0.3 backports.zstd==1.0.0 bcrypt==5.0.0 billiard==4.2.2 blinker==1.9.0 Bottleneck==1.6.0 Brotli==1.1.0 cachelib==0.13.0 cachetools==6.2.1 cattrs==25.3.0 celery==5.5.3 certifi==2025.10.5 cffi==2.0.0 charset-normalizer==3.4.4 click==8.3.0 click-didyoumean==0.3.1 click-option-group==0.5.9 click-plugins==1.1.1.2 click-repl==0.3.0 colorama==0.4.6 cron_descriptor==2.0.6 croniter==6.0.0 cryptography==43.0.3 defusedxml==0.7.1 Deprecated==1.2.18 deprecation==2.1.0 dnspython==2.8.0 email-validator==2.3.0 et_xmlfile==2.0.0 exceptiongroup==1.3.0 Flask==2.3.3 Flask-AppBuilder==4.8.1 Flask-Babel==2.0.0 Flask-Caching==2.3.1 Flask-Compress==1.20 Flask-JWT-Extended==4.7.1 Flask-Limiter==3.12 Flask-Login==0.6.3 Flask-Migrate==3.1.0 Flask-Session==0.8.0 Flask-SQLAlchemy==2.5.1 flask-talisman==1.1.0 Flask-WTF==1.2.2 frozenlist==1.8.0 geographiclib==2.1 geopy==2.4.1 google-auth==2.41.1 greenlet==3.1.1 gunicorn==23.0.0 h11==0.16.0 hashids==1.3.1 holidays==0.25 humanize==4.14.0 idna==3.11 importlib_metadata==8.7.0 invoke==2.2.1 isodate==0.7.2 itsdangerous==2.2.0 Jinja2==3.1.6 jsonpath-ng==1.7.0 jsonschema==4.25.1 jsonschema-specifications==2025.9.1 kombu==5.5.4 korean-lunar-calendar==0.3.1 limits==5.6.0 Mako==1.3.10 Markdown==3.9 markdown-it-py==4.0.0 MarkupSafe==3.0.3 marshmallow==3.26.1 marshmallow-sqlalchemy==1.4.2 mdurl==0.1.2 msgpack==1.0.8 msgspec==0.19.0 multidict==6.7.0 nh3==0.2.22 numpy==1.26.4 odfpy==1.4.1 openpyxl==3.1.5 ordered-set==4.1.0 outcome==1.3.0.post0 packaging==25.0 pandas==2.0.3 paramiko==4.0.0 parsedatetime==2.6 pgsanity==0.3.0 pillow==12.0.0 platformdirs==4.5.0 ply==3.11 polyline==2.0.3 prison==0.2.1 prompt_toolkit==3.0.52 propcache==0.4.1 psycopg2-binary==2.9.11 pyarrow==14.0.2 pyasn1==0.6.1 pyasn1_modules==0.4.2 pycparser==2.23 Pygments==2.19.2 PyJWT==2.10.1 PyMySQL==1.1.2 PyNaCl==1.6.0 pyOpenSSL==25.1.0 pyparsing==3.2.5 PySocks==1.7.1 python-dateutil==2.9.0.post0 python-dotenv==1.1.1 python-geohash==0.8.5 python-graphql-client==0.4.3 pytz==2025.2 pyxlsb==1.0.10 PyYAML==6.0.3 redis==4.6.0 referencing==0.37.0 requests==2.32.5 requests-cache==1.2.1 rich==13.9.4 rpds-py==0.28.0 rsa==4.9.1 selenium==4.37.0 shillelagh==1.4.2 shortid==0.1.2 simplejson==3.20.2 six==1.17.0 slack_sdk==3.37.0 sniffio==1.3.1 sortedcontainers==2.4.0 SQLAlchemy==1.4.54 SQLAlchemy-Utils==0.38.3 sqlglot==26.33.0 sqlparse==0.5.3 sshtunnel==0.4.0 tabulate==0.8.10 tomli==2.3.0 trio==0.31.0 trio-websocket==0.12.2 typing_extensions==4.15.0 tzdata==2025.2 url-normalize==2.2.1 urllib3==2.5.0 vine==5.1.0 wcwidth==0.2.14 websocket-client==1.9.0 websockets==15.0.1 Werkzeug==3.1.3 wrapt==1.17.3 wsproto==1.2.0 WTForms==3.2.1 WTForms-JSON==0.3.5 xlrd==2.0.2 XlsxWriter==3.0.9 yarl==1.22.0 zipp==3.23.0 (venv) gapinyc@DESKTOP-9QS7RL5:~/superset$
最新发布
10-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值