如何使用 SQLAlchemy 使用 SELECT COUNT(*) 计算行数?
在本文中,我们将看到如何在Python中使用 SQLAlchemy 选择行数。
由于我们将在这篇文章中使用 MySQL,因此我们还将在Python中为 MySQL 安装 SQL 连接器。但是,除了 SQL 连接器之外,没有任何代码实现会随着数据库的变化而变化。
pip install pymysql
我们将使用 mySQL 中的示例sakila 数据库。在本文中,我们将介绍 2 个示例,每个示例用于 SQLAchemy Core 和 ORM 层。在这两个示例中,我们将计算sakila数据库中的actor表中存在的记录数。如果您没有sakila数据库并且想在不安装它的情况下继续阅读本文,那么使用下面提到的链接中的 SQL 脚本来创建所需的模式和参与者表以及记录。 Sakila 演员表脚本
我们在以下两个示例中查看的 SQL 查询是 -
SELECT COUNT(*) FROM sakila.`actor`;
SQLAlchemy 核心
SQLAlchemy Core 是一个以模式为中心的模型,这意味着一切都被视为数据库的一部分,即行、列、表等。在上面的示例中,我们创建了元数据对象来访问表等数据库对象。使用这个对象,我们得到了演员表的元数据。然后使用下面提到的 SQLAlchemy 语法使用此元数据信息查询表。
Syntax: sqlalchemy.select([sqlalchemy.func.count()]).select_from(sqlalchemy.DeclarativeMeta).scalar()
Python
import sqlalchemy as db
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://root:password@localhost/sakila")
# CREATE THE METADATA OBJECT TO ACCESS THE TABLE
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
# GET THE `actor` TABLE FROM THE METADATA OBJECT
actor_table = meta_data.tables['actor']
# SELECT COUNT(*) FROM Actor
result = db.select([db.func.count()]).select_from(actor_table).scalar()
print("Count:", result)
Python
import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://root:password@localhost/sakila")
# CREATE THE TABLE MODEL TO USE IT FOR QUERYING
class Actor(Base):
__tablename__ = 'actor'
actor_id = db.Column(db.SmallInteger,
primary_key=True,
autoincrement=True)
first_name = db.Column(db.String(45))
last_name = db.Column(db.String(45))
last_update = db.Column(db.DateTime)
city = db.Column(db.String(20))
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
# SELECT COUNT(*) FROM Actor
result = session.query(Actor).count()
print("Count:", result)
输出:
Count: 200
SQLAlchemy ORM
SQLAlchemy Core 使用以对象为中心的视图,它将模式与业务对象封装在一起。这是一个更 Pythonic 的实现,因为我们可以看到以类格式表示的表。我们已经使用这个类对象使用下面提到的 SQLAlchemy 语法来查询演员表。
Syntax: sqlalchemy.orm.Session.query(sqlalchemy.DeclarativeMeta).count()
Python
import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://root:password@localhost/sakila")
# CREATE THE TABLE MODEL TO USE IT FOR QUERYING
class Actor(Base):
__tablename__ = 'actor'
actor_id = db.Column(db.SmallInteger,
primary_key=True,
autoincrement=True)
first_name = db.Column(db.String(45))
last_name = db.Column(db.String(45))
last_update = db.Column(db.DateTime)
city = db.Column(db.String(20))
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
# SELECT COUNT(*) FROM Actor
result = session.query(Actor).count()
print("Count:", result)
输出:
Count: 200