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

 更新时间:2023年09月06日 08:48:55   作者:鲸落_  
作为软件开发人员,查询 PostgreSQL 视图是一项常见任务,使用视图(代表SQL 查询输出的虚拟表)被认为是处理关系数据库时的有效方法,本文介绍如何在 Python 中使用 SQLAlchemy 查询 PostgreSQL 视图,需要的朋友可以参考下

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

先决条件

  • 对 Python 和使用Python 的机器有很好的了解。
  • 了解 SQL、PostgreSQL 和 SQLAlchemy 的基本概念。
  • Postgres 安装在您的本地计算机上。

所需模块

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视图的资料请关注脚本之家其它相关文章!

相关文章

  • Python中的pickle模块常用函数

    Python中的pickle模块常用函数

    这篇文章主要介绍了Python中的pickle模块常用函数,pickle模块使用的数据格式是python专用的,能够把python对象直接保存到文件,而不需要转化为字符串,也不用底层的文件访问操作把它们写入到一个二进制文件中,需要的朋友可以参考下
    2023-09-09
  • Python3多线程详解

    Python3多线程详解

    使用多线程,可以同时进行多项任务,可以使用户界面更友好,还可以后台执行某些用时长的任务,同时具有易于通信的优点。python3中多线程的实现使用了threading模块,它允许同一进程中运行多个线程,本文介绍的非常详细,,需要的朋友可以参考下
    2023-05-05
  • Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法

    Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法

    这篇文章主要介绍了Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法,简单描述了最长公共子序列问题并结合实例形式分析了Python基于回溯法子集树模板获取最长公共子序列的操作步骤与相关注意事项,需要的朋友可以参考下
    2017-09-09
  • Pycharm无法使用已经安装Selenium的解决方法

    Pycharm无法使用已经安装Selenium的解决方法

    今天小编就为大家分享一篇Pycharm无法使用已经安装Selenium的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python基础教程之浅拷贝和深拷贝实例详解

    Python基础教程之浅拷贝和深拷贝实例详解

    这篇文章主要介绍了Python基础教程之浅拷贝和深拷贝实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • Linux上Miniconda的安装的实现步骤

    Linux上Miniconda的安装的实现步骤

    Miniconda是一个轻量级、免费且开源的跨平台软件包管理系统,本文主要介绍了Linux上Miniconda的安装的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • keras读取训练好的模型参数并把参数赋值给其它模型详解

    keras读取训练好的模型参数并把参数赋值给其它模型详解

    这篇文章主要介绍了keras读取训练好的模型参数并把参数赋值给其它模型详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python性能测试手机号验证码登录压测示例详解

    python性能测试手机号验证码登录压测示例详解

    这篇文章主要为大家介绍了python性能测试手机号验证码登录压测的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • pytorch 实现cross entropy损失函数计算方式

    pytorch 实现cross entropy损失函数计算方式

    今天小编就为大家分享一篇pytorch 实现cross entropy损失函数计算方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python Bamboolib库加速Pandas数据分析过程详解

    python Bamboolib库加速Pandas数据分析过程详解

    这篇文章主要介绍了python Bamboolib库加速Pandas数据分析过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论