61_sqlalchemy基本使用

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等操作。

后端开发标签