要执行范围查询或模糊查询,可使用 SQLAlchemy 提供的运算符和函数来构建更复杂的过滤条件。下面是一些示例:
1. **范围查询(Range Query)**:可以使用 `between` 运算符来查询某个范围内的记录。
from sqlalchemy import between
# 查询年龄在 25 到 35 之间的记录
records = session.query(MyTable).filter(MyTable.age.between(25, 35)).all()
2. **模糊查询(Like Query)**:可以使用 `like` 函数进行模糊查询,使用 `%` 表示通配符。
from sqlalchemy import like
# 查询姓名以 'J' 开头的记录
records = session.query(MyTable).filter(MyTable.name.like('J%')).all()
# 查询姓名包含 'oh' 的记录
records = session.query(MyTable).filter(MyTable.name.like('%oh%')).all()
3. **逻辑运算符(Logical Operators)**:可以使用 `and_`、`or_` 和 `not_` 运算符组合多个过滤条件。
from sqlalchemy import and_, or_
# 查询年龄为 30 并且姓名以 'J' 开头的记录
records = session.query(MyTable).filter(and_(MyTable.age == 30, MyTable.name.like('J%'))).all()
# 查询年龄为 25 或者 30 的记录
records = session.query(MyTable).filter(or_(MyTable.age == 25, MyTable.age == 30)).all()
from sqlalchemy import and_, or_, not_
# 查询年龄在 25 到 35 之间,并且姓名以 'J' 开头,但排除姓为 'John' 的记录
records = session.query(MyTable).filter(and_(MyTable.age.between(25, 35), MyTable.name.like('J%'), not_(MyTable.name == 'John'))).all()
-----------
在使用SQLAlchemy时,`filter_by`和`filter`是两种常用的方法,用于对查询结果进行过滤。它们之间有一些区别:
1. **filter_by**:
- `filter_by`方法用于基于指定的关键字参数进行过滤。
- 它可以更简洁地指定过滤条件,但是无法处理复杂的条件。
- 通常用于在简单情况下进行过滤,例如对某个特定列进行等值匹配。
- 返回的结果是基于指定条件过滤后的查询对象。
# 示例:使用 filter_by 进行等值匹配
record = session.query(MyTable).filter_by(name='John').first()
2. **filter**:
- `filter`方法则更加灵活,可以处理更复杂的条件,包括使用运算符、函数和组合条件。
- 可以通过`and_`、`or_`和其他逻辑运算符结合多个条件进行查询。
- 对于复杂的查询需求,通常更适合使用`filter`方法。
- 返回的结果也是基于指定条件过滤后的查询对象。
# 示例:使用 filter 进行复杂条件查询
records = session.query(MyTable).filter(and_(MyTable.age >= 25, MyTable.age <= 35)).all()
总的来说,`filter_by`适用于简单的等值匹配,而`filter`则更适用于复杂的条件查询。根据具体的情况选择使用哪种方法。
----------
使用SQLAlchemy库进行数据库操作的基本流程通常包括以下步骤:
- 创建引擎(Create Engine):首先,创建一个数据库引擎,该引擎将负责与数据库进行通信和交互。引擎可以通过
create_engine()
函数创建,并指定数据库的连接信息,如数据库类型(SQLite、MySQL、PostgreSQL等)和连接字符串。
from sqlalchemy import create_engine
engine = create_engine('sqlite:///example.db') # 创建SQLite数据库引擎
- 创建会话(Create Session):然后,创建一个会话,会话负责管理数据库连接和事务。可以使用
sessionmaker()
函数创建会话类,并绑定到先前创建的引擎上。
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine) # 创建一个会话类
session = Session() # 创建一个会话实例
- 定义映射类(Define Mapping Classes):接下来,定义映射类,这些类将数据库中的表映射到Python对象。通常,每个表都对应一个映射类,并使用
declarative_base()
函数创建基类。
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
- 执行数据库操作(Perform Database Operations):使用会话执行各种数据库操作,如添加、查询、更新和删除记录等。
# 添加记录
new_record = MyTable(name='John', age=30)
session.add(new_record)
session.commit() # 提交事务
# 查询记录
records = session.query(MyTable).filter_by(age=30).all()
for record in records:
print(record.name, record.age)
# 更新记录
record_to_update = session.query(MyTable).filter_by(name='John').first()
record_to_update.age = 35
session.commit() # 提交事务
# 删除记录
record_to_delete = session.query(MyTable).filter_by(name='John').first()
session.delete(record_to_delete)
session.commit() # 提交事务
- 关闭会话(Close Session):最后,结束数据库操作时关闭会话,释放资源。
session.close()
这些是使用SQLAlchemy进行数据库操作的基本步骤。
--------------------
func
是 SQLAlchemy 提供的一个模块,用于在查询中使用 SQL 函数。它允许你在查询中使用各种 SQL 函数,如 COUNT()
、SUM()
、MAX()
、MIN()
等,以及数据库特定的函数,如 UPPER()
(将字符串转换为大写)、LOWER()
(将字符串转换为小写)等。
这个模块的使用通常是在查询的过程中,可在查询语句中使用 func
来调用各种函数,从而在数据库层面执行相应的操作。
以下是一个简单的示例,演示如何在查询中使用 func
:
from sqlalchemy import create_engine, func
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
# 创建数据库引擎
engine = create_engine('sqlite:///example.db')
# 创建一个基类
Base = declarative_base()
# 定义ORM映射类
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# 创建一个Session类工厂函数
Session = sessionmaker(bind=engine)
# 使用Session类创建一个数据库会话
session = Session()
# 查询用户表中的记录数量
user_count = session.query(func.count(User.id)).scalar()
print("Total users:", user_count)
# 查询用户表中年龄的平均值
average_age = session.query(func.avg(User.age)).scalar()
print("Average age of users:", average_age)
# 查询用户表中年龄的最大值
max_age = session.query(func.max(User.age)).scalar()
print("Maximum age of users:", max_age)
# 现在可以使用session来执行数据库操作
在上面的示例中,我们使用了 func.count()
、func.avg()
和 func.max()
来分别计算用户记录的数量、年龄的平均值和最大年龄。