如何使用 Python 中的 SQLAlchemy 对 SQL 列进行 GroupBy 和 Sum 操作?
当我们踏入 Python 及其强大的库 SQLAlchemy 的领域时,就会发现一个充满多功能操作的源泉。其中一项功能是对 SQL 列进行 GroupBy 和 Sum 操作,这在数据库操作中至关重要。SQLAlchemy 是一款 SQL 工具包,也是 Python 的对象关系映射 (ORM) 系统,它提供了丰富的功能,可以以一种无缝且符合 Python 风格的方式促进 SQL 操作。让我们深入了解如何利用 SQLAlchemy 对 SQL 列进行 GroupBy 和 Sum 操作。
语法
在本文中,我们将探讨如何使用 SQLAlchemy(一个流行的 Python SQL 工具包)来执行 SQL 列的分组和求和。我们将演示两种方法——ORM 会话方法和显式会话方法。这两种方法都会影响 SQLAlchemy 对数据库任务的作用力,并提供简洁直观的语法。
Stmt=session.query(Sales.product,func.sum(Sales.quantity).label('total_quantity')).group_by(Sales.product)
算法
分步说明:
导入必要的模块。
与数据库建立会话。
查询数据库,指定要进行分组和求和的列。
使用 group_by() 函数对数据进行分组。
使用 func.sum() 计算总和。
执行命令并获取结果。
处理任何异常,并关闭会话。
方法 1:使用显式会话
第一种方法是使用显式会话,这非常适合基于应用程序的代码。
示例
from sqlalchemy import create_engine, Column, Integer, String, func from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # Create a new engine instance engine = create_engine('sqlite:///example.db') Base = declarative_base() # Define a new table with a name, metadata, and several columns class Sales(Base): __tablename__ = 'sales' id = Column(Integer, primary_key=True) product = Column(String) quantity = Column(Integer) # Create the table Base.metadata.create_all(engine) # Prepare data 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), ] # Create a session Session = sessionmaker(bind=engine) session = Session() try: # Add data to the session session.add_all(data) # Commit the changes session.commit() # Create a select statement stmt = session.query(Sales.product, func.sum(Sales.quantity).label('total_quantity')).group_by(Sales.product) # Execute the statement results = stmt.all() for result in results: print(result) finally: # Close the session session.close()
解释
在这种方法中,我们遵循与前面方法类似的初始设置,创建引擎并定义表结构。我们使用 sessionmaker 手动创建会话工厂,并使用 Session() 打开会话。在 try-finally 块中,我们将数据添加到会话中,提交更改,并创建用于分组和求和的 select 语句。我们执行语句,处理结果,最后关闭会话。
这两种方法提供了实现相同结果的不同方式。根据您的项目需求和编码偏好,您可以选择最适合您需求的方法。
方法 2:使用 ORM 会话
第二种方法使用 SQLAlchemy ORM(对象关系映射),它允许将类映射到数据库中的表,从而提供高级的、符合 Python 风格的接口。
示例
from sqlalchemy import create_engine, Column, Integer, String, func from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # Create a new engine instance engine = create_engine('sqlite:///example.db') Session = sessionmaker(bind=engine) session = Session() Base = declarative_base() # Define a new table with a name, metadata, and several columns class Sales(Base): __tablename__ = 'sales' id = Column(Integer, primary_key=True) product = Column(String) quantity = Column(Integer) # Create the table Base.metadata.create_all(engine) # Prepare data 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), ] # Add and commit data to the session session.add_all(data) session.commit() # Create a select statement stmt = session.query(Sales.product, func.sum(Sales.quantity).label('total_quantity')).group_by(Sales.product) # Execute the statement 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 操作了。编码愉快!