python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python SQLAlchemy查询PostgreSQL视图

在python中使用SQLAlchemy查询PostgreSQL视图的流程步骤

作者:鲸落_

作为软件开发人员,查询 PostgreSQL 视图是一项常见任务,使用视图(代表SQL 查询输出的虚拟表)被认为是处理关系数据库时的有效方法,本文介绍如何在 Python 中使用 SQLAlchemy 查询 PostgreSQL 视图,需要的朋友可以参考下

作为软件开发人员,查询 PostgreSQL 视图是一项常见任务。使用视图(代表SQL 查询输出的虚拟表)被认为是处理关系数据库时的有效方法。本文介绍如何在 Python 中使用 SQLAlchemy 查询 PostgreSQL 视图。在直接进行演示之前,以下是我们将使用的所有工具的概述。

先决条件

所需模块

pip install psycopg2
pip install sqlalchemy

使用 SQLAlchemy 查询 (PostgreSQL) 视图的步骤

创建数据库和用户

现在,我们首先通过使用用户创建数据库来设置 PostgreSQL,并授予该用户对所创建数据库的所有必需权限。

# 创建一个名为demo的数据库
CREATE DATABASE demo;
# 创建了一个用户脱模器,密码为12345678
CREATE USER demouser WITH PASSWORD '12345678';
# 已将客户端编码配置为utf8
ALTER ROLE demouser SET client_encoding TO 'utf8';
ALTER ROLE demouser SET default_transaction_isolation TO 'read committed';
ALTER ROLE demouser SET timezone TO 'UTC';
# 授予所有必需的权限,以便在demodb上卸载
GRANT ALL PRIVILEGES ON DATABASE demo TO demouser;

image.png

设置Python开发环境

到目前为止,我们已经创建并配置了一个数据库用户,现在让我们配置用于开发的虚拟环境,这一步可以跳过,但始终建议为每个项目使用专用的开发环境,以避免依赖冲突,这可以通过以下方式实现 Python 虚拟环境。

mkdir gfg
cd gfg

文件夹的名称并不重要,您可以将其命名为任何您想要的名称,然后 cd (更改目录)进入新创建的目录,然后运行以下命令,为您的项目创建虚拟环境。

to create a virtual environment
python -m venv venv
to activate the virtual environment
.\venv\Scripts\activate

image.png

使用 Python 连接到 Postgres

在此步骤中,我们将连接到之前创建的“demo”数据库并创建一个视图名称 demo_view,然后对其进行查询。

使用 Python 连接到 Postgres 可以使用我们刚刚安装的 psycopg2 适配器来实现,如图所示,

from sqlalchemy import create_engine
engine = create_engine('postgresql://demouser:12345678@localhost:5432/demo')
# 连接到数据库并打印连接成功(如果已连接)
with engine.connect() as conn:
	print("Connection successful")

输出:

image.png

创建所需的表

要使用 Python 查询 PostgreSQL 视图,我们首先需要数据库中存在一些数据,但目前数据库中还没有

image.png

在将一些数据插入数据库之前,我们需要通过将其定义为 SQLAlchemy 表来创建视图,如下所示,

from sqlalchemy import create_engine, MetaData, Table,
Column, Integer, String, DateTime
# 使用SQLAlchemy创建数据库引擎并连接到数据库服务器
engine = create_engine('postgresql:'+
					'//demouser:12345678@localhost:5432/demo')
# 创建元数据对象
metadata = MetaData()
# 为演示视图创建一个表对象
demo_view = Table('demo_view', metadata,
				Column('id', Integer, primary_key=True),
				Column('name', String),
				Column('created_at', DateTime)
				)
# 在数据库中创建演示视图
metadata.create_all(engine)

输出:

image.png

将数据插入 Postgres

现在我们已经配置了所有内容并创建了 demo_view 表,让我们插入一些数据并查询 demo_view 表,该表将使用以下 Python 脚本返回一个视图,

# 在演示视图中插入一些数据
with engine.connect() as conn:
	conn.execute(demo_view.insert(), [
		{'name': 'John', 'created_at': '2021-07-01'},
		{'name': 'Jane', 'created_at': '2021-07-02'},
		{'name': 'Joe', 'created_at': '2021-07-03'}
	])
	# commit the changes
	conn.commit()
# 查询demo视图以获取name和createdAt列
query = select().select_from(demo_view).with_only_columns(
		demo_view.c.name, demo_view.c.created_at)
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的 Python 脚本首先包含 2 个部分,其中我们将一些数据插入到 demo_view 表中,然后查询同一个表以返回仅包含 name 和created_at 列的视图。最后,它将打印从数据库返回的视图中的所有行,

image.png

如果我们检查数据库,数据已插入到 demo_view 表中,

image.png

使用 SQLAlchemy 查询 Postgres 视图

查询数据库视图是指查找视图中满足指定条件的行。以下是查询数据库视图的不同方法:

使用 Group By 子句查询数据库视图

Group By 子句根据所选列对视图中的行进行分组。以下查询显示 demo_view 中每个名称的行数。

query = select().select_from(demo_view).with_only_columns(
demo_view.c.name,
func.count(demo_view.c.name)
).group_by(demo_view.c.name)
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的查询将按名称返回 demo_view 中的行数。

image.png

使用distinct关键字查询数据库视图 

unique 关键字返回视图中不同的行。以下查询返回 demo_view 中的唯一名称。

query = select().select_from(
demo_view).with_only_columns(
	demo_view.c.name).distinct()
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的查询返回 demo_view 中的唯一名称。

image.png

使用 Order By 子句查询数据库视图 

Order By 子句根据指定的列对视图中的行进行排序。以下查询返回 demo_view 中按created_at 列排序的行。

query = select().select_from(
demo_view).order_by(
demo_view.c.created_at)
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出: 

上面的查询返回 demo_view 中按created_at 列排序的行。

image.png

使用 Sum 函数查询数据库视图 

Sum 函数返回指定列中的值的总和。以下查询返回 demo_view 的 id 列中的值的总和。

query = select().select_from(
demo_view).order_by(
demo_view.c.created_at)
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的查询将返回 demo_view 的 id 列中的值的总和。

image.png

使用 Avg 函数查询数据库视图 

Avg 函数返回指定列中值的平均值。以下查询返回 demo_view 中 id 列值的平均值。

query = select().select_from(
demo_view).with_only_columns(
func.avg(demo_view.c.id))
# 执行查询并打印结果
with engine.connect() as conn:
result = conn.execute(query).fetchall()
for row in result:
	print(row)

输出:

上面的查询将返回demo_view中id列值的平均值。

image.png

使用 Count 函数查询数据库视图 

Count 函数返回视图中特定列或属性的计数或行数。

query = select().select_from(
demo_view).with_only_columns(
func.count(demo_view.c.id))
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的查询返回 demo_view 中的行数。

image.png

使用 Min 函数查询数据库视图 

sqlalchemy 提供的 Min 函数返回指定列的所有行中特定属性的最小值或最小值。以下是在 id 列上使用 Min 函数实现的查询的演示,

query = select().select_from(
demo_view).with_only_columns(
func.min(demo_view.c.id))
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的查询将返回 demo_view 中 id 列的最小值。

image.png

使用 Max 函数查询数据库视图 

Max 函数与 Min 相同但完全相反,返回查询中指定列的属性最大值。以下查询返回 demo_view 中 id 列的最大值。

query = select().select_from(
demo_view).with_only_columns(
func.max(demo_view.c.id))
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的查询将返回 demo_view 中 id 列的最大值。

image.png

使用“in”关键字查询数据库视图 

“in”关键字返回视图中指定列中的值与指定列表中的任何值匹配的行。以下查询返回 demo_view 中名称列值与指定列表中的值匹配的行。

query = select('*').select_from(
demo_view).where(
cast(
	demo_view.c.name, String
).in_(['John', 'Jane']))
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

上面的查询返回 demo_view 中名称列值与给定列表中的任何值匹配的行。

image.png

使用“and”关键字查询数据库视图 

关键字“and”返回视图中匹配所有指定条件的行。以下查询返回 demo_view 中具有与指定值匹配的 name 列值和与指定值匹配的 id 列值的行。

query = select().select_from(
demo_view).where(
and_(demo_view.c.name == "John", demo_view.c.id == 1))
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

使用“or”关键字查询数据库视图 

“or”函数返回视图中与任何指定条件匹配的行,与逻辑或运算符相同。以下查询将返回 demo_view 中 name 列值等于“John”或 id 列值等于 2 的行,

query = select('*').select_from(demo_view).where(
	(demo_view.c.name == "John") | (demo_view.c.id == 2)
)
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出:

image.png

使用“not”关键字查询数据库视图

 “not”关键字返回视图中与指定条件不匹配的行。以下查询返回 demo_view 中名称列值不与指定值匹配的行。

query = select('*').select_from(demo_view).where(
	not_(demo_view.c.name == "John")
)
# 执行查询并打印结果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

输出 :

image.png

以上就是在python中使用SQLAlchemy查询PostgreSQL视图的流程步骤的详细内容,更多关于python SQLAlchemy查询PostgreSQL视图的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文