跳转至

SQLALchemy 模块

SQLAlchemy 概念详解

SQLAlchemy 是一个功能强大的 Python SQL 工具包和 ORM(对象关系映射)库。它通过抽象化的接口和灵活的功能,让开发者能够高效地与数据库进行交互。以下是 SQLAlchemy 的核心概念详解。

1. SQLAlchemy Core 和 ORM

SQLAlchemy 提供了两种主要的 API:SQLAlchemy CoreSQLAlchemy ORM

  • SQLAlchemy Core: 是底层的 SQL 表达式语言,允许直接构建和执行 SQL 语句。它提供了数据库无关的抽象层,使开发者能够在不同数据库之间无缝切换。

  • SQLAlchemy ORM: 是基于 SQLAlchemy Core 的高级抽象层,提供了对象关系映射的功能。ORM 将数据库表映射为 Python 类,使得开发者能够使用 Python 对象操作数据库,而不需要直接编写 SQL 语句。

2. Engine(引擎)

EngineSQLAlchemy 的核心组件之一,负责与数据库的实际连接。通过 EngineSQLAlchemy 可以将 SQL 表达式发送到数据库,并接收数据库的结果。

from sqlalchemy import create_engine

engine = create_engine('sqlite:///example.db')

上面的代码创建了一个 SQLite 数据库引擎。create_engine() 函数的参数可以是不同数据库的连接字符串,如 MySQL、PostgreSQL 等。

3. MetaData

MetaData 是一个容器对象,用于保存数据库中的表结构信息。它是 SQLAlchemy Core 的关键部分,用于管理 Table 对象,以及在数据库和 Python 代码之间同步表结构。

from sqlalchemy import MetaData

metadata = MetaData()

4. Table(表)

Table 对象表示数据库中的表。通过 Table 对象,可以定义表结构、列类型及约束条件。每个 Table 对象都绑定到一个 MetaData 实例。

from sqlalchemy import Table, Column, Integer, String

users = Table(
    'users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('age', Integer)
)

在上面的例子中,我们定义了一个名为 users 的表,其中包含三列:idnameage

5. Declarative Base

Declarative BaseSQLAlchemy ORM 的基础。通过 declarative_base() 函数创建的基类,可以通过继承这个基类来定义 ORM 模型类。

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

Declarative Base 提供了一种声明式的方式来定义 ORM 模型类,并将这些类与数据库中的表进行映射。

6. ORM 模型类

ORM 模型类是 SQLAlchemy ORM 的核心,用于将数据库中的表映射为 Python 类。每个模型类代表数据库中的一张表,类中的属性对应表中的列。

from sqlalchemy import Column, Integer, String

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

在这个例子中,User 类映射到数据库中的 users 表,idnameage 是表中的列。

7. Session(会话)

SessionSQLAlchemy ORM 的主要接口,用于管理与数据库的所有交互。Session 对象负责维持数据库连接,并处理事务的开始、提交和回滚。

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

Session 对象通过 sessionmaker 函数创建,并绑定到特定的 Engine

8. 关系映射

SQLAlchemy ORM 支持多种关系映射,包括一对多、多对多和一对一的关系。关系映射允许开发者在 Python 对象之间定义复杂的关联,并在查询中自动加载相关对象。

  • 一对多关系: 一个对象可以关联多个对象。例如,一个用户可以有多个地址。
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    email = Column(String)
    user = relationship("User", back_populates="addresses")

User.addresses = relationship("Address", order_by=Address.id, back_populates="user")
  • 多对多关系: 通过关联表来定义多对多关系。例如,用户可以属于多个群组,而一个群组可以包含多个用户。
from sqlalchemy import Table

association_table = Table('association', Base.metadata,
    Column('user_id', Integer, ForeignKey('users.id')),
    Column('group_id', Integer, ForeignKey('groups.id'))
)

class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)
    name = Column(String)

User.groups = relationship("Group", secondary=association_table, back_populates="users")
Group.users = relationship("User", secondary=association_table, back_populates="groups")

9. 查询构造器

SQLAlchemy ORM 提供了强大的查询构造器,用于构建和执行复杂的 SQL 查询。通过链式调用,可以构建条件查询、聚合查询等。

from sqlalchemy import and_, or_

# 查询名字为 'Alice' 且年龄大于等于 25 的用户
users = session.query(User).filter(and_(User.name == 'Alice', User.age >= 25)).all()

10. 事务管理

SQLAlchemySession 对象提供了事务管理的功能。通过显式地开启和提交事务,开发者可以确保数据库操作的原子性和一致性。

session.begin()
try:
    user = User(name='Bob', age=30)
    session.add(user)
    session.commit()
except:
    session.rollback()
    raise

11. Eager 和 Lazy Loading

SQLAlchemy 支持两种加载方式:Eager Loading(急切加载)和 Lazy Loading(延迟加载)。Eager Loading 会在查询时立即加载所有相关数据,而 Lazy Loading 则在首次访问相关属性时才加载数据。

from sqlalchemy.orm import joinedload

# Lazy Loading (默认)
user = session.query(User).first()
print(user.addresses)  # 此时才加载 addresses

# Eager Loading
user = session.query(User).options(joinedload(User.addresses)).first()

12. 总结

SQLAlchemy 提供了灵活且功能强大的工具集,适合各种规模的应用程序开发。通过对 SQLAlchemy CoreSQLAlchemy ORM 的深入理解和运用,开发者可以高效地管理数据库操作,编写可维护性强的代码。

这就是 SQLAlchemy 的核心概念详解,希望能帮助你更好地理解和使用这个强大的库。