SQLAlchemy使用迭代器/生成器查询数据

Source

在SQLAlchemy中,可以使用迭代器来批量查询和处理数据。这样可以提高内存效率,特别是在处理大量数据时。下面是一个使用迭代器查询数据的例子:

安装SQLAlchemy

首先,确保你已经安装了SQLAlchemy库:

pip install sqlalchemy

然后设置一个简单的模型,用于后续的查询操作:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# 创建数据库连接和会话
engine = create_engine('sqlite:///test.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

yield_per创建迭代器

现在,你可以使用yield_per方法来创建一个迭代器查询数据:

def query_users_iterator():
    return session.query(User).yield_per(100)  # 每次查询100条记录

# 插入一些示例数据(仅用于测试)
for i in range(1000):
    user =User(name=f"User {
      
        i}", age=i % 100)
    session.add(user)
    session.commit()
# 使用迭代器进行查询和处理数据
for user in query_users_iterator():
    print(f"User ID: {
      
        user.id}, Name: {
      
        user.name}, Age: {
      
        user.age}")
# 关闭会话
session.close()

在这个例子中,我们首先插入了一些示例数据,然后使用query_users_iterator()函数创建了一个迭代器,每次从数据库中查询100条记录。在循环中,我们可以对查询到的数据进行处理,比如输出用户信息。

这种方法在处理大量数据时非常有用,因为它可以减少内存使用,避免一次性将所有数据加载到内存中。

筛选、排序

如果你想对查询结果进行更多操作,例如筛选、排序等,可以在创建迭代器时将这些操作添加到查询中。例如,假设我们想要查询年龄在30岁以上的用户,并按照年龄升序排列:

from sqlalchemy import and_

def query_users_iterator_filtered():
    return session.query(User).filter(and_(User.age > 30)).order_by(User.age).yield_per(100)

# 使用带筛选条件的迭代器进行查询和处理数据
for user in query_users_iterator_filtered():
    print(f"User ID: {
      
        user.id}, Name: {
      
        user.name}, Age: {
      
        user.age}")

在这个例子中,我们使用filter和order_by方法对查询结果进行了筛选和排序。and_是SQLAlchemy中的逻辑操作符,允许你组合多个条件。在这里,我们使用它来筛选年龄大于30的用户。

使用迭代器查询数据不仅可以提高内存效率,还可以方便地对查询结果进行筛选、排序等操作。这使得在处理大量数据时,你可以灵活地按需处理数据。

参考

https://docs.sqlalchemy.org/en/20/orm/queryguide/query.html#sqlalchemy.orm.Query.yield_per