SQLAlchemy 完全指南:Python 数据库建模 – wiki大全

SQLAlchemy 完全指南:Python 数据库建模

SQLAlchemy 是 Python 中一个强大且广泛使用的开源 SQL 工具包和对象关系映射 (ORM) 库,它为 Python 应用程序与关系型数据库的交互提供了灵活且高性能的解决方案。它通过抽象底层 SQL 查询的复杂性,让开发者能够使用 Python 对象来操作数据库。

核心概念与组成部分

  1. ORM (Object-Relational Mapping)
    ORM 是一种编程技术,用于将应用程序中的对象映射到关系数据库中的表。SQLAlchemy 的 ORM 允许您使用 Python 类来定义数据库模型,并将这些类的实例自动映射到数据库表中的行。这使得开发者可以使用面向对象的方式执行数据库操作,而无需编写直接的 SQL 语句。

    • ORM 的优势

      • 数据库无关性:ORM 处理不同数据库(如 MySQL, PostgreSQL, SQLite)之间 SQL 语法的差异,便于数据库迁移。
      • 防止 SQL 注入:它自动处理参数绑定,降低了 SQL 注入攻击的风险。
      • 提高代码可读性和可维护性:通过将数据模型与业务逻辑分离,ORM 提升了代码组织结构。
      • Pythonic 接口:它提供了高级的、符合 Python 习惯的数据库交互接口。
    • ORM 的劣势

      • 性能开销:Python 对象和数据库表之间的转换层可能会引入一定的性能开销,尤其是在处理大数据集时。
      • 小型项目的复杂性:对于非常小的项目,SQLAlchemy 的配置和使用可能过于复杂。
  2. SQLAlchemy Core
    这是 SQLAlchemy 的基础层,提供了一个 SQL 表达式语言,允许您使用 Python 以编程方式构建 SQL 语句。与 ORM 相比,它提供了对 SQL 查询更大的灵活性和控制力,适用于复杂查询或需要精细控制 SQL 的场景。

  3. Engine (引擎)
    Engine 对象是所有 SQLAlchemy 应用程序的起点。它负责管理数据库连接并处理 SQL 方言转换。您通过提供一个数据库 URL 来创建引擎,该 URL 指定了数据库类型、驱动、用户名、密码、主机、端口和数据库名称。

  4. Session (会话)
    Session 对象提供了一种管理对象(实体)及其与数据库交互生命周期的方式。它充当对象更改的暂存区,在提交到数据库之前,所有操作都会先在此处进行。

  5. Declarative Base (声明性基类)
    declarative_base() 用于创建一个基类,您的 ORM 模型将继承自该基类。这个基类存储了关于表元数据的信息,并允许您以声明式的方式定义模型。

使用 SQLAlchemy 进行 Python 数据库建模的步骤

  1. 安装
    使用 pip 安装 SQLAlchemy:
    bash
    pip install sqlalchemy

  2. 数据库连接
    创建一个 Engine 对象来建立与数据库的连接。SQLAlchemy 支持多种数据库,如 SQLite、PostgreSQL、MySQL 等。
    “`python
    from sqlalchemy import create_engine

    SQLite 示例

    engine = create_engine(‘sqlite:///test.db’, echo=True)

    MySQL 示例(需要安装 pymysql:pip install pymysql)

    engine = create_engine(‘mysql+pymysql://username:password@host:port/database’)

    ``echo=True` 参数会打印执行的 SQL 语句,这对于调试非常有用。

  3. 定义 ORM 模型 (表结构)
    定义继承自 declarative_base() 的 Python 类来表示您的数据库表。
    “`python
    from sqlalchemy import Column, Integer, String
    from sqlalchemy.ext.declarative import declarative_base

    Base = declarative_base()

    class User(Base):
    tablename = ‘users’ # 数据库中的表名
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(50), nullable=False)
    age = Column(Integer)

    def __repr__(self):
        return f"<User(id={self.id}, name='{self.name}', age={self.age})>"
    

    ``
    *
    tablename指定数据库中的表名。
    *
    Column定义列名、数据类型和约束(例如primary_key=True,nullable=False`)。

  4. 创建表
    使用 Base.metadata.create_all(engine) 根据您定义的模型在数据库中创建相应的表。如果表已存在,此方法不会重新创建。

  5. 会话管理
    创建一个 sessionmaker 来生成 Session 对象,Session 对象用于数据库操作。
    python
    from sqlalchemy.orm import sessionmaker
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

  6. CRUD 操作 (创建、读取、更新、删除)

    • 创建 (添加数据)
      创建模型类的实例,将其添加到会话中,然后提交会话。
      python
      session = SessionLocal()
      new_user = User(name="Alice", age=30)
      session.add(new_user)
      session.commit()
      session.close()

    • 读取 (查询数据)
      使用会话查询数据。SQLAlchemy 2.0 引入了使用 select() 的新查询方式。
      python
      from sqlalchemy import select
      session = SessionLocal()
      stmt = select(User).where(User.name == "Alice")
      user = session.execute(stmt).scalars().first()
      print(user)
      session.close()

    • 更新数据
      检索对象,修改其属性,然后提交会话。
      python
      session = SessionLocal()
      user_to_update = session.execute(select(User).filter_by(name="Alice")).scalars().first()
      if user_to_update:
      user_to_update.age = 31
      session.commit()
      session.close()

    • 删除数据
      检索对象,标记其为删除,然后提交会话。
      python
      session = SessionLocal()
      user_to_delete = session.execute(select(User).filter_by(name="Alice")).scalars().first()
      if user_to_delete:
      session.delete(user_to_delete)
      session.commit()
      session.close()

高级特性

SQLAlchemy 还提供了许多高级特性,例如模型之间的关系(一对多、多对多)、事务管理、连接池、事件监听器以及与 Alembic 等迁移工具的集成。它是一个为企业级持久化模型设计的健壮框架,能够提供高效且高性能的数据库访问。许多流行的 Python 框架,如 FastAPI 和 Flask,都可以与 SQLAlchemy 无缝集成。

滚动至顶部