SQLALchemy 模块¶
SQLAlchemy 概念详解¶
SQLAlchemy
是一个功能强大的 Python SQL 工具包和 ORM(对象关系映射)库。它通过抽象化的接口和灵活的功能,让开发者能够高效地与数据库进行交互。以下是 SQLAlchemy
的核心概念详解。
1. SQLAlchemy Core 和 ORM¶
SQLAlchemy
提供了两种主要的 API:SQLAlchemy Core
和 SQLAlchemy ORM
。
-
SQLAlchemy Core: 是底层的 SQL 表达式语言,允许直接构建和执行 SQL 语句。它提供了数据库无关的抽象层,使开发者能够在不同数据库之间无缝切换。
-
SQLAlchemy ORM: 是基于 SQLAlchemy Core 的高级抽象层,提供了对象关系映射的功能。ORM 将数据库表映射为 Python 类,使得开发者能够使用 Python 对象操作数据库,而不需要直接编写 SQL 语句。
2. Engine(引擎)¶
Engine
是 SQLAlchemy
的核心组件之一,负责与数据库的实际连接。通过 Engine
,SQLAlchemy
可以将 SQL 表达式发送到数据库,并接收数据库的结果。
上面的代码创建了一个 SQLite 数据库引擎。create_engine()
函数的参数可以是不同数据库的连接字符串,如 MySQL、PostgreSQL 等。
3. MetaData¶
MetaData
是一个容器对象,用于保存数据库中的表结构信息。它是 SQLAlchemy Core
的关键部分,用于管理 Table
对象,以及在数据库和 Python 代码之间同步表结构。
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
的表,其中包含三列:id
、name
和 age
。
5. Declarative Base¶
Declarative Base
是 SQLAlchemy ORM
的基础。通过 declarative_base()
函数创建的基类,可以通过继承这个基类来定义 ORM 模型类。
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
表,id
、name
和 age
是表中的列。
7. Session(会话)¶
Session
是 SQLAlchemy ORM
的主要接口,用于管理与数据库的所有交互。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. 事务管理¶
SQLAlchemy
的 Session
对象提供了事务管理的功能。通过显式地开启和提交事务,开发者可以确保数据库操作的原子性和一致性。
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 Core
和 SQLAlchemy ORM
的深入理解和运用,开发者可以高效地管理数据库操作,编写可维护性强的代码。
这就是 SQLAlchemy
的核心概念详解,希望能帮助你更好地理解和使用这个强大的库。