1. SQLAlchemy简介
SQLAlchemy是一个流行的Python库,用于处理关系型数据库(如SQLite、PostgreSQL和MySQL等),能够在Python对象和数据库之间建立直接映射关系。它提供了一种将数据存储在数据库中的统一方式,通过这种统一的方式,我们可以不需要关心数据库的种类,只需要关注SQLAlchemy提供的接口。
SQLAlchemy的主要功能包括:
数据模型定义
数据库会话操作
查询构建器和表达式语言
2. 安装SQLAlchemy
在使用SQLAlchemy之前,我们需要先安装它。可以使用pip命令进行安装。
pip install sqlalchemy
3. 连接数据库
连接数据库是使用SQLAlchemy进行数据库操作的第一步。SQLAlchemy定义了一种特殊的类别,例如Engine和Session,这些类别被用来通过Python访问底层数据库。Engine类别是连接到数据库的核心,Session则用于和数据库交互。
3.1 创建Engine
在使用SQLAlchemy之前,需要先创建一个Engine。对于SQLite数据库,可以使用如下代码进行Engine的创建。
from sqlalchemy import create_engine
engine = create_engine('sqlite:///example.db', echo=True)
这个代码所做的事情是创建了一个连接到SQLite数据库example.db文件的Engine。echo=True的作用是在控制台上输出日志,便于调试。
3.2 创建Session
Session是操作数据库的主要接口。在使用数据库之前,必须先创建一个Session。可以使用如下代码创建Session。
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
这个代码所做的事情是创建一个Session,用于操作绑定到的引擎engine。
4. 数据库操作
4.1 创建表格
在SQLAlchemy中,我们以Python类的形式定义数据表。在定义类之后,我们通过调用metadata.create_all()方法来创建数据表。
from sqlalchemy import Table, Column, Integer, String, MetaData
metadata = MetaData()
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('age', Integer),
Column('gender', String)
)
metadata.create_all(engine)
这个代码所做的事情是定义一个名为users的数据表,包含id、name、age和gender四个字段。然后通过调用metadata.create_all()方法,将定义好的表格映射到actual database上面,创建对应的表格。
4.2 插入数据
插入数据需要先创建一个Python对象,然后将该对象插入数据库中。
from sqlalchemy import insert
query = insert(users).values(name='Alice', age=25, gender='female')
connection = engine.connect()
result_proxy = connection.execute(query)
result_proxy.rowcount
这个代码所做的事情是创建一个插入数据的SQLAlchemy查询,并插入一条数据,插入后通过result_proxy.rowcount查看插入的数据行数。
4.3 查询数据
SQLAlchemy提供了基于ORM和原始SQL的两种查询方式。这里介绍基于ORM的查询方式。
4.3.1 基本查询
我们可以使用query()方法来创建查询,然后调用all()方法来查询所有符合条件的数据。
from sqlalchemy.orm import selectinload
query = session.query(User).options(selectinload(User.addresses))
users = session.query(users).all()
这个代码执行了一个查询操作,查询所有的users数据。
4.3.2 条件查询
我们可以通过filter()方法来筛选数据,它返回的结果是一个Query对象。
from sqlalchemy.orm import selectinload
query = session.query(User).filter(User.age == 25)
users = session.query(users).all()
这个代码执行了一个筛选操作,筛选所有age为25的users数据。
4.3.3 模糊查询
SQLAlchemy提供了类似SQL的模糊查询操作,可以使用like()函数。
from sqlalchemy import like
query = session.query(User).filter(User.name.like('%Al%'))
users = session.query(users).all()
这个代码执行了一个模糊查询操作,筛选名字中包含Al字符的users数据。
4.3.4 排序查询
SQLAlchemy提供了类似SQL的排序查询操作,可以使用order_by()函数。
query = session.query(User).order_by(User.age)
users = session.query(users).all()
这个代码执行了一个排序查询操作,按照age字段升序排列。
4.3.5 分组查询
SQLAlchemy提供了类似SQL的分组查询操作,可以使用group_by()函数。
query = session.query(User.age, func.count(User.id)).group_by(User.age)
users = session.query(users).all()
这个代码执行了一个分组查询操作,按照age字段分组,并统计每组中id的数量。
4.3.6 关联查询
在SQLAlchemy中,关系可以通过ORM添加到数据表模型中,用于描述一对多或多对多的关系。我们先定义两个数据表users和addresses,用户可以有多个地址。
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
addresses = relationship('Address', back_populates='user')
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship('User', back_populates='addresses')
Base.metadata.create_all(engine)
这个代码做了以下事情:
定义了User和Address两个Python类,通过metadata创建数据库表格。
使用relationship定义User和Address之间的关系。
然后进行关联查询。
query = session.query(User).options(selectinload(User.addresses))
users = session.query(users).all()
这个代码执行了一个关联查询操作,返回所有用户及其地址信息。
总结
SQLAlchemy提供了一个优雅的方式来处理关系型数据库。通过建立Python对象和数据库之间的映射关系,使得数据库的操作可以更加方便和直观。在使用SQLAlchemy时,我们需要注意定义数据表、创建连接、创建Session等操作。