📜  如何使用 SQLAlchemy 对 SQL 列进行分组和求和?

📅  最后修改于: 2022-05-13 01:54:54.181000             🧑  作者: Mango

如何使用 SQLAlchemy 对 SQL 列进行分组和求和?

在本文中,我们将了解如何在 SQLAlchemy 中使用 GroupBy 和 Sum。

安装 SQLAlchemy

SQLAlchemy 可通过 pip install 包获得。

pip install sqlalchemy

但是,如果您使用的是烧瓶,您可以使用它自己的 SQLAlchemy 实现。它可以安装使用 -

pip install flask-sqlalchemy

在示例中,我们将使用通用语法。

  • sqlalchemy.create_engine(URL):创建一个引擎对象,可以直接用于与数据库交互,也可以传递给 Session 对象以使用 ORM。数据库 URL 的典型形式是“dialect+driver://username:password@host:port/database”
  • sqlalchemy.select(*entities):用于生成 SELECT 语句的主要结构。实体通常是一系列可供选择的列。
  • sqlalchemy.select(*entities).group_by(column_name):用于生成 GROUP BY 语句的主要结构。
  • sqlalchemy.func.sum(column_name): SQL SUM() 聚合函数。
  • sqlalchemy.engine.execute(statement):执行给定的语句并返回一个结果对象。

在列中使用 GroupBy 和 Sum

示例 1:

在我们继续之前,我们需要有一个数据库和一个表来使用。对于此示例,我们使用 mySQL 数据库并创建了一个销售表。该表有 3 列和 9 条记录,如下所示。

销售表

在上表中,我们将使用公司列进行分组,并将在no_of_invoices列上进行聚合。

Python
import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `sales` table from the Metadata object
SALES = meta_data.tables['sales']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([SALES.c.company, db.func.sum(SALES.c.no_of_invoices)]) \
    .group_by(SALES.c.company)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", "Company:", record[0],
          "| Sum of Invoices:", 
          record[1])


Python
import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `students` table from the Metadata object
STUDENTS = meta_data.tables['students']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([
    STUDENTS.c.first_name,
    STUDENTS.c.last_name,
    db.func.sum(STUDENTS.c.score)
]).group_by(STUDENTS.c.first_name, STUDENTS.c.last_name)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", record[0], record[1],
          "| Total Score:", record[2])


Python
import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `students` table from the Metadata object
STUDENTS = meta_data.tables['students']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([
    STUDENTS.c.course,
    db.func.sum(STUDENTS.c.score)
]).group_by(STUDENTS.c.course)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", "Course:", record[0],
          "| Total Score:", record[1])


输出:

示例 1 输出

解释:

  • 首先,为了简单起见,我们将 sqlalchemy 库导入为db 。所有 sqlalchemy 对象、方法等都将使用db前缀导入,以提高清晰度。
  • 然后我们创建引擎,它将作为与数据库的连接来执行所有数据库操作。
  • 创建元数据对象。元数据对象“元数据”包含有关我们数据库的所有信息。
  • 使用元数据信息从数据库中获取销售表。
  • 我们现在可以编写一个 SQLAlchemy 查询来获取所需的记录。我们首先使用`group_by()`方法根据公司名称进行分组,然后使用 SQLalchemy 的`func.sum()`函数找到发票数量的总和。
  • 打印输出。在输出中,我们可以看到我们有不同的公司名称及其相应的发票总和。

示例 2:

在此示例中,让我们考虑以下学生

学生桌

在此示例中,我们将执行以两列为参考的 GROUP BY 操作。

Python

import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `students` table from the Metadata object
STUDENTS = meta_data.tables['students']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([
    STUDENTS.c.first_name,
    STUDENTS.c.last_name,
    db.func.sum(STUDENTS.c.score)
]).group_by(STUDENTS.c.first_name, STUDENTS.c.last_name)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", record[0], record[1],
          "| Total Score:", record[2])

输出:

示例 2 输出

解释:

上面的代码与示例 1 中讨论的代码非常相似,只是在此示例中我们对多个列(即first_namelast_name字段)执行了 GROUP BY 操作。在group_by()方法中可以将多个字段作为单独的参数提及。

示例 3:

考虑到示例 2 中提到的学生表,让我们看看如果我们对课程字段执行 GROUP BY 操作,输出将如何变化。

Python

import sqlalchemy as db
  
# Define the Engine (Connection Object)
engine = db.create_engine(
    "mysql+pymysql://root:password@localhost/Geeks4Geeks")
  
# Create the Metadata Object
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
  
# Get the `students` table from the Metadata object
STUDENTS = meta_data.tables['students']
  
# SQLAlchemy Query to GROUP BY and aggregate SUM
query = db.select([
    STUDENTS.c.course,
    db.func.sum(STUDENTS.c.score)
]).group_by(STUDENTS.c.course)
  
# Fetch all the records
result = engine.execute(query).fetchall()
  
# View the records
for record in result:
    print("\n", "Course:", record[0],
          "| Total Score:", record[1])

输出:

示例 3 输出