如何使用 Python 中的 SQLAlchemy 对 SQL 列进行 GroupBy 和 Sum?

pythonserver side programmingprogramming更新于 2024/1/11 16:42:00

随着我们深入 Python 及其强大的库 SQLAlchemy 领域,我们揭示了多种多样的操作。其中一种功能是对 SQL 列执行 GroupBy 和 Sum 操作 - 这是数据库操作中至关重要的操作。SQLAlchemy 是一个 SQL 工具包和 Python 的对象关系映射 (ORM) 系统,它提供了丰富的功能,以无缝和 Pythonic 的方式促进 SQL 操作。让我们深入研究如何利用 SQLAlchemy 对 SQL 列进行 GroupBy 和 Sum。

语法

在本文中,我们将探讨如何使用流行的 Python SQL 工具包 SQLAlchemy 对 SQL 列进行分组和求和。我们将演示两种方法 - ORM 会话方法和显式会话方法。这两种方法影响了 SQLAlchemy 处理信息库任务的能力,并提供了完美而直观的语法。

Stmt=session.query(Sales.product,func.sum(Sales.quantity).label('total_quantity')).group_by(Sales.product)

算法

分步说明 −

  • 导入必要的模块。

  • 与数据库建立会话。

  • 查询数据库,指定要分组和求和的列。

  • 使用 group_by() 函数对数据进行分组。

  • 使用 func.sum() 计算sum。

  • 执行命令并获取结果。

  • 处理异常(如果有),并关闭会话。

方法 1:使用显式会话

第一种方法是使用显式会话,这对于基于应用程序的代码来说是理想的。

示例

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

# 创建新引擎实例
engine = create_engine('sqlite:///example.db')

Base = declarative_base()

# 定义一个具有名称、元数据和多个列的新表
class Sales(Base):
   __tablename__ = 'sales'
   
   id = Column(Integer, primary_key=True)
   product = Column(String)
   quantity = Column(Integer)

# 创建表
Base.metadata.create_all(engine)

# 准备数据
data = [
   Sales(product='Apples', quantity=5),
   Sales(product='Oranges', quantity=7),
   Sales(product='Apples', quantity=3),
   Sales(product='Bananas', quantity=8),
   Sales(product='Apples', quantity=6),
   Sales(product='Oranges', quantity=9),
]

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

try:
    # 将数据添加到会话
    session.add_all(data)
    
    # 提交更改
    session.commit()
    
    # 创建一个 select 语句
    stmt = session.query(Sales.product, func.sum(Sales.quantity).label('total_quantity')).group_by(Sales.product)
    
    # 执行语句
    results = stmt.all()
    
   	for result in results:
      print(result)

finally:
   # 关闭会话
   session.close()

解释

在此方法中,我们遵循与上一种方法类似的初始设置,即创建引擎并定义表结构。我们使用 sessionmaker 手动创建会话工厂,并使用 Session() 打开会话。在 try-finally 块中,我们将数据添加到会话中,提交更改,并创建用于分组和求和的选择语句。我们执行语句,处理结果,最后关闭会话。

这两种方法提供了实现类似结果的各种方法。根据你的项目要求和编码倾向,你可以选择最适合你需求的方法。

方法 2:使用 ORM 会话

第二种方法利用 SQLAlchemy ORM(对象关系映射器),它允许将类映射到数据库中的表,从而提供高级 Pythonic 接口。

示例

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

# 创建一个新引擎实例
engine = create_engine('sqlite:///example.db')

Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

# 定义一个具有名称、元数据和多个列的新表
class Sales(Base):
   __tablename__ = 'sales'
    
   id = Column(Integer, primary_key=True)
   product = Column(String)
   quantity = Column(Integer)

# 创建表
Base.metadata.create_all(engine)

# 准备数据
data = [
   Sales(product='Apples', quantity=5),
   Sales(product='Oranges', quantity=7),
   Sales(product='Apples', quantity=3),
   Sales(product='Bananas', quantity=8),
   Sales(product='Apples', quantity=6),
   Sales(product='Oranges', quantity=9),
]

# 将数据添加并提交到会话
session.add_all(data)
session.commit()

# 创建 select 语句
stmt = session.query(Sales.product, func.sum(Sales.quantity).label('total_quantity')).group_by(Sales.product)

# 执行语句
results = stmt.all()

for result in results:
   print(result)

session.close()

解释

在这种方法中,我们首先创建一个引擎来连接数据库。然后,我们使用 sessionmaker 定义一个会话工厂并实例化一个会话对象。接下来,我们使用 declarative_base() 为表定义声明一个基类,并使用 Sales 类定义表的结构。我们使用 Base.metadata.create_all(engine) 在数据库中创建表。

要执行分组和求和,我们使用 session.add_all(data) 将必要的数据添加到会话中,并使用 session.commit() 提交更改。我们使用 session.query 和 func.sum 创建具有分组和求和的 select 语句,并使用 stmt.all() 执行它。最后,我们处理结果并使用 session.close() 关闭会话。

结论

对 SQL 表中的列进行分组和求和是数据操作和分析中基本但必不可少的操作。 SQLAlchemy 具有出色的易用性和类似 Python 的语法,弥补了 SQL 操作和 Python 编程之间的差距。根据上下文使用显式会话或 ORM 会话的能力进一步增加了 SQLAlchemy 的吸引力。上述两种方法都可以根据需求进行定制,为使用 SQL 数据库的 Python 用户奠定了坚实的基础。请务必记得关闭会话以释放资源。有了这些,您现在就掌握了使用 Python 中的 SQLAlchemy 执行 GroupBy 和 Sum 操作的知识。祝您编码愉快!


相关文章