📜  如何在 SQLAlchemy 查询中使用 sum 和 order by?

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

如何在 SQLAlchemy 查询中使用 sum 和 order by?

在本文中,我们将了解如何在 SQLAlchemy 中针对Python中的 PostgreSQL 数据库执行 sum 和 count函数。

SUM 和计数操作使用不同的函数以不同的方法执行。这种数学运算是依赖于数据库的。在 PostgreSQL 中,Group by 使用 sum()函数执行,count 操作使用 count() 执行。在 SQLAlchemy 中,像使用 func 属性的常规 SQL 函数一样调用 SUM、MIN、MAX 等通用函数。

SQLAlchemy 中使用的一些常用函数是count、cube、current_date、current_time、max、min、mode 等。

创建一个示例表进行演示

从 SQLAlchemy 包中导入必要的函数。并使用如下所示的 create_engine()函数与 PostgreSQL 数据库建立连接,创建一个名为 books 的表,其中包含 book_id 和 book_price 列。如图所示,使用 insert() 和 values()函数将记录插入表中。

Python3
# import necessary packages
import sqlalchemy
from sqlalchemy import create_engine, MetaData,
Table, Column, Numeric, Integer, VARCHAR
from sqlalchemy.engine import result
 
# establish connections
engine = create_engine(
    "postgresql+psycopg2://postgres:Saibaba97%40@127.0.0.1:5432/test")
 
# initialize the Metadata Object
meta = MetaData(bind=engine)
MetaData.reflect(meta)
 
# create a table schema
books = Table(
    'books', meta,
    Column('bookId', Integer, primary_key=True),
    Column('book_price', Numeric),
    Column('genre', VARCHAR),
    Column('book_name', VARCHAR)
)
 
meta.create_all(engine)
 
# insert records into the table
statement1 = books.insert().values(bookId=1, book_price=12.2,
                                   genre = 'fiction',
                                   book_name = 'Old age')
statement2 = books.insert().values(bookId=2, book_price=13.2,
                                   genre = 'non-fiction',
                                   book_name = 'Saturn rings')
statement3 = books.insert().values(bookId=3, book_price=121.6,
                                   genre = 'fiction',
                                   book_name = 'Supernova')
statement4 = books.insert().values(bookId=4, book_price=100,
                                   genre = 'non-fiction',
                                   book_name = 'History of the world')
statement5 = books.insert().values(bookId=5, book_price=1112.2,
                                   genre = 'fiction',
                                   book_name = 'Sun city')
 
# execute the insert records statement
engine.execute(statement1)
engine.execute(statement2)
engine.execute(statement3)
engine.execute(statement4)
engine.execute(statement5)


Python3
# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# SQLAlchemy Query to use sum and order by function
query = sqlalchemy.select([
    BOOKS.c.genre,
    sqlalchemy.func.sum(BOOKS.c.book_price)
]).group_by(BOOKS.c.genre).order_by(BOOKS.c.genre)
 
# Fetch all the records
result = engine.execute(query).fetchall()
 
# View the records
for record in result:
    print("\n", record)


输出:

样品表

在 SQLAlchemy 中实现 sum 和 order by

按函数编写 sum 和 order 的过程与传统 SQL 查询的过程略有不同,如下所示

在连接到数据库时从初始化的 Metadata 对象中获取 books 表,并将 SQL 查询传递给 execute()函数,并使用 fetchall()函数获取所有结果,并使用 for 循环遍历结果。

此 SQL 查询返回基于书籍类型的书籍价格总和,并根据书籍类型按字母顺序排序。

Python3

# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# SQLAlchemy Query to use sum and order by function
query = sqlalchemy.select([
    BOOKS.c.genre,
    sqlalchemy.func.sum(BOOKS.c.book_price)
]).group_by(BOOKS.c.genre).order_by(BOOKS.c.genre)
 
# Fetch all the records
result = engine.execute(query).fetchall()
 
# View the records
for record in result:
    print("\n", record)

输出:

sum 和 order by 函数的输出