Python SQLAlchemy – func.count 和过滤器
在本文中,我们将看到如何使用 SQLAlchemy 中的 count函数对Python中的 PostgreSQL 数据库执行过滤操作
使用不同的函数以不同的方法执行带有过滤器操作的计数。这种数学运算是依赖于数据库的。在 PostgreSQL 中,使用 count()函数执行计数,使用 filter() 执行过滤操作。在 SQLAlchemy 中,像使用 func 属性的常规 SQL 函数一样调用 SUM、MIN、MAX 等通用函数。
SQLAlchemy 中使用的一些常用函数是 count、cube、current_date、current_time、max、min、mode 等。
Usage: func.count(). func.group_by(), func.max()
为演示创建表
从 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(
"database+dialect://username:password@host:port/databasename")
# 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 GROUP BY and filter function
query = sqlalchemy.select([
BOOKS.c.genre,
sqlalchemy.func.count(BOOKS.c.genre)
]).group_by(BOOKS.c.genre).filter(BOOKS.c.book_price > 50.0)
# Fetch all the records
result = engine.execute(query).fetchall()
# View the records
for record in result:
print("\n", record)
输出:
在 SQLAlchemy 中实现 GroupBy 和 count
编写 groupby函数的过程与传统 SQL 查询的过程略有不同,如下所示
sqlalchemy.select([
Tablename.c.column_name,
sqlalchemy.func.count(Tablename.c.column_name)
]).group_by(Tablename.c.column_name).filter(Tablename.c.column_name value)
从连接到数据库时初始化的元数据对象获取书籍表。将 SQL 查询传递给 execute()函数并使用 fetchall()函数获取所有结果。使用 for 循环遍历结果。
以下查询返回价格大于 Rs 的不同类型的书籍的数量。 50.
Python3
# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
# SQLAlchemy Query to GROUP BY and filter function
query = sqlalchemy.select([
BOOKS.c.genre,
sqlalchemy.func.count(BOOKS.c.genre)
]).group_by(BOOKS.c.genre).filter(BOOKS.c.book_price > 50.0)
# Fetch all the records
result = engine.execute(query).fetchall()
# View the records
for record in result:
print("\n", record)
输出: