欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在python中使用SQLAlchemy查詢PostgreSQL視圖的流程步驟

 更新時(shí)間:2023年09月06日 08:48:55   作者:鯨落_  
作為軟件開發(fā)人員,查詢 PostgreSQL 視圖是一項(xiàng)常見任務(wù),使用視圖(代表SQL 查詢輸出的虛擬表)被認(rèn)為是處理關(guān)系數(shù)據(jù)庫(kù)時(shí)的有效方法,本文介紹如何在 Python 中使用 SQLAlchemy 查詢 PostgreSQL 視圖,需要的朋友可以參考下

作為軟件開發(fā)人員,查詢 PostgreSQL 視圖是一項(xiàng)常見任務(wù)。使用視圖(代表SQL 查詢輸出的虛擬表)被認(rèn)為是處理關(guān)系數(shù)據(jù)庫(kù)時(shí)的有效方法。本文介紹如何在 Python 中使用 SQLAlchemy 查詢 PostgreSQL 視圖。在直接進(jìn)行演示之前,以下是我們將使用的所有工具的概述。

先決條件

  • 對(duì) Python 和使用Python 的機(jī)器有很好的了解。
  • 了解 SQL、PostgreSQL 和 SQLAlchemy 的基本概念。
  • Postgres 安裝在您的本地計(jì)算機(jī)上。

所需模塊

pip install psycopg2
pip install sqlalchemy

使用 SQLAlchemy 查詢 (PostgreSQL) 視圖的步驟

創(chuàng)建數(shù)據(jù)庫(kù)和用戶

現(xiàn)在,我們首先通過使用用戶創(chuàng)建數(shù)據(jù)庫(kù)來設(shè)置 PostgreSQL,并授予該用戶對(duì)所創(chuàng)建數(shù)據(jù)庫(kù)的所有必需權(quán)限。

# 創(chuàng)建一個(gè)名為demo的數(shù)據(jù)庫(kù)
CREATE DATABASE demo;
# 創(chuàng)建了一個(gè)用戶脫模器,密碼為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';
# 授予所有必需的權(quán)限,以便在demodb上卸載
GRANT ALL PRIVILEGES ON DATABASE demo TO demouser;

image.png

設(shè)置Python開發(fā)環(huán)境

到目前為止,我們已經(jīng)創(chuàng)建并配置了一個(gè)數(shù)據(jù)庫(kù)用戶,現(xiàn)在讓我們配置用于開發(fā)的虛擬環(huán)境,這一步可以跳過,但始終建議為每個(gè)項(xiàng)目使用專用的開發(fā)環(huán)境,以避免依賴沖突,這可以通過以下方式實(shí)現(xiàn) Python 虛擬環(huán)境。

mkdir gfg
cd gfg

文件夾的名稱并不重要,您可以將其命名為任何您想要的名稱,然后 cd (更改目錄)進(jìn)入新創(chuàng)建的目錄,然后運(yùn)行以下命令,為您的項(xiàng)目創(chuàng)建虛擬環(huán)境。

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

image.png

使用 Python 連接到 Postgres

在此步驟中,我們將連接到之前創(chuàng)建的“demo”數(shù)據(jù)庫(kù)并創(chuàng)建一個(gè)視圖名稱 demo_view,然后對(duì)其進(jìn)行查詢。

使用 Python 連接到 Postgres 可以使用我們剛剛安裝的 psycopg2 適配器來實(shí)現(xiàn),如圖所示,

from sqlalchemy import create_engine
engine = create_engine('postgresql://demouser:12345678@localhost:5432/demo')
# 連接到數(shù)據(jù)庫(kù)并打印連接成功(如果已連接)
with engine.connect() as conn:
	print("Connection successful")

輸出:

image.png

創(chuàng)建所需的表

要使用 Python 查詢 PostgreSQL 視圖,我們首先需要數(shù)據(jù)庫(kù)中存在一些數(shù)據(jù),但目前數(shù)據(jù)庫(kù)中還沒有

image.png

在將一些數(shù)據(jù)插入數(shù)據(jù)庫(kù)之前,我們需要通過將其定義為 SQLAlchemy 表來創(chuàng)建視圖,如下所示,

from sqlalchemy import create_engine, MetaData, Table,
Column, Integer, String, DateTime
# 使用SQLAlchemy創(chuàng)建數(shù)據(jù)庫(kù)引擎并連接到數(shù)據(jù)庫(kù)服務(wù)器
engine = create_engine('postgresql:'+
					'//demouser:12345678@localhost:5432/demo')
# 創(chuàng)建元數(shù)據(jù)對(duì)象
metadata = MetaData()
# 為演示視圖創(chuàng)建一個(gè)表對(duì)象
demo_view = Table('demo_view', metadata,
				Column('id', Integer, primary_key=True),
				Column('name', String),
				Column('created_at', DateTime)
				)
# 在數(shù)據(jù)庫(kù)中創(chuàng)建演示視圖
metadata.create_all(engine)

輸出:

image.png

將數(shù)據(jù)插入 Postgres

現(xiàn)在我們已經(jīng)配置了所有內(nèi)容并創(chuàng)建了 demo_view 表,讓我們插入一些數(shù)據(jù)并查詢 demo_view 表,該表將使用以下 Python 腳本返回一個(gè)視圖,

# 在演示視圖中插入一些數(shù)據(jù)
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)
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

上面的 Python 腳本首先包含 2 個(gè)部分,其中我們將一些數(shù)據(jù)插入到 demo_view 表中,然后查詢同一個(gè)表以返回僅包含 name 和created_at 列的視圖。最后,它將打印從數(shù)據(jù)庫(kù)返回的視圖中的所有行,

image.png

如果我們檢查數(shù)據(jù)庫(kù),數(shù)據(jù)已插入到 demo_view 表中,

image.png

使用 SQLAlchemy 查詢 Postgres 視圖

查詢數(shù)據(jù)庫(kù)視圖是指查找視圖中滿足指定條件的行。以下是查詢數(shù)據(jù)庫(kù)視圖的不同方法:

使用 Group By 子句查詢數(shù)據(jù)庫(kù)視圖

Group By 子句根據(jù)所選列對(duì)視圖中的行進(jìn)行分組。以下查詢顯示 demo_view 中每個(gè)名稱的行數(shù)。

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)
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

上面的查詢將按名稱返回 demo_view 中的行數(shù)。

image.png

使用distinct關(guān)鍵字查詢數(shù)據(jù)庫(kù)視圖 

unique 關(guān)鍵字返回視圖中不同的行。以下查詢返回 demo_view 中的唯一名稱。

query = select().select_from(
demo_view).with_only_columns(
	demo_view.c.name).distinct()
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

上面的查詢返回 demo_view 中的唯一名稱。

image.png

使用 Order By 子句查詢數(shù)據(jù)庫(kù)視圖 

Order By 子句根據(jù)指定的列對(duì)視圖中的行進(jìn)行排序。以下查詢返回 demo_view 中按created_at 列排序的行。

query = select().select_from(
demo_view).order_by(
demo_view.c.created_at)
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出: 

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

image.png

使用 Sum 函數(shù)查詢數(shù)據(jù)庫(kù)視圖 

Sum 函數(shù)返回指定列中的值的總和。以下查詢返回 demo_view 的 id 列中的值的總和。

query = select().select_from(
demo_view).order_by(
demo_view.c.created_at)
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

上面的查詢將返回 demo_view 的 id 列中的值的總和。

image.png

使用 Avg 函數(shù)查詢數(shù)據(jù)庫(kù)視圖 

Avg 函數(shù)返回指定列中值的平均值。以下查詢返回 demo_view 中 id 列值的平均值。

query = select().select_from(
demo_view).with_only_columns(
func.avg(demo_view.c.id))
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
result = conn.execute(query).fetchall()
for row in result:
	print(row)

輸出:

上面的查詢將返回demo_view中id列值的平均值。

image.png

使用 Count 函數(shù)查詢數(shù)據(jù)庫(kù)視圖 

Count 函數(shù)返回視圖中特定列或?qū)傩缘挠?jì)數(shù)或行數(shù)。

query = select().select_from(
demo_view).with_only_columns(
func.count(demo_view.c.id))
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

上面的查詢返回 demo_view 中的行數(shù)。

image.png

使用 Min 函數(shù)查詢數(shù)據(jù)庫(kù)視圖 

sqlalchemy 提供的 Min 函數(shù)返回指定列的所有行中特定屬性的最小值或最小值。以下是在 id 列上使用 Min 函數(shù)實(shí)現(xiàn)的查詢的演示,

query = select().select_from(
demo_view).with_only_columns(
func.min(demo_view.c.id))
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

上面的查詢將返回 demo_view 中 id 列的最小值。

image.png

使用 Max 函數(shù)查詢數(shù)據(jù)庫(kù)視圖 

Max 函數(shù)與 Min 相同但完全相反,返回查詢中指定列的屬性最大值。以下查詢返回 demo_view 中 id 列的最大值。

query = select().select_from(
demo_view).with_only_columns(
func.max(demo_view.c.id))
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

上面的查詢將返回 demo_view 中 id 列的最大值。

image.png

使用“in”關(guān)鍵字查詢數(shù)據(jù)庫(kù)視圖 

“in”關(guān)鍵字返回視圖中指定列中的值與指定列表中的任何值匹配的行。以下查詢返回 demo_view 中名稱列值與指定列表中的值匹配的行。

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

輸出:

上面的查詢返回 demo_view 中名稱列值與給定列表中的任何值匹配的行。

image.png

使用“and”關(guān)鍵字查詢數(shù)據(jù)庫(kù)視圖 

關(guān)鍵字“and”返回視圖中匹配所有指定條件的行。以下查詢返回 demo_view 中具有與指定值匹配的 name 列值和與指定值匹配的 id 列值的行。

query = select().select_from(
demo_view).where(
and_(demo_view.c.name == "John", demo_view.c.id == 1))
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

使用“or”關(guān)鍵字查詢數(shù)據(jù)庫(kù)視圖 

“or”函數(shù)返回視圖中與任何指定條件匹配的行,與邏輯或運(yùn)算符相同。以下查詢將返回 demo_view 中 name 列值等于“John”或 id 列值等于 2 的行,

query = select('*').select_from(demo_view).where(
	(demo_view.c.name == "John") | (demo_view.c.id == 2)
)
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出:

image.png

使用“not”關(guān)鍵字查詢數(shù)據(jù)庫(kù)視圖

 “not”關(guān)鍵字返回視圖中與指定條件不匹配的行。以下查詢返回 demo_view 中名稱列值不與指定值匹配的行。

query = select('*').select_from(demo_view).where(
	not_(demo_view.c.name == "John")
)
# 執(zhí)行查詢并打印結(jié)果
with engine.connect() as conn:
	result = conn.execute(query).fetchall()
	for row in result:
		print(row)

輸出 :

image.png

以上就是在python中使用SQLAlchemy查詢PostgreSQL視圖的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于python SQLAlchemy查詢PostgreSQL視圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python創(chuàng)建文本文件的簡(jiǎn)單方法

    python創(chuàng)建文本文件的簡(jiǎn)單方法

    在本篇內(nèi)容里小編給大家整理分享的是一篇關(guān)于python創(chuàng)建文本文件的簡(jiǎn)單方法,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-08-08
  • python怎么提高計(jì)算速度

    python怎么提高計(jì)算速度

    在本篇文章里小編給大家分享的是一篇關(guān)于python中如何提高計(jì)算速度的技術(shù)文章,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • tensorflow中tf.reduce_mean函數(shù)的使用

    tensorflow中tf.reduce_mean函數(shù)的使用

    這篇文章主要介紹了tensorflow中tf.reduce_mean函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python?使用turtle實(shí)現(xiàn)實(shí)時(shí)鐘表并生成exe

    python?使用turtle實(shí)現(xiàn)實(shí)時(shí)鐘表并生成exe

    這篇文章主要為大家詳細(xì)介紹了python使用Turtle庫(kù)繪制動(dòng)態(tài)鐘表,并有需要可以生成exe可執(zhí)行文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Python Collections強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)工具使用實(shí)例探索

    Python Collections強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)工具使用實(shí)例探索

    這篇文章主要介紹了Python Collections強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)工具的使用實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 教你怎么用Python生成九宮格照片

    教你怎么用Python生成九宮格照片

    過年過節(jié)大家的朋友圈是不是特別熱鬧,每當(dāng)小編看見朋友圈有這種九宮格的照片就覺得特別秀,一直想自己什么時(shí)候也能來秀一個(gè),所以直接拿這個(gè)練練手,酷炸朋友圈一波,直接進(jìn)入主題,需要的朋友可以參考下
    2021-05-05
  • Python中eval()函數(shù)的詳細(xì)使用教程

    Python中eval()函數(shù)的詳細(xì)使用教程

    eval函數(shù)在Python中具有非常重要的地位,熟練的使用eval函數(shù)能夠?yàn)槲覀兊腜ython編程提供很多的便利之處,下面這篇文章主要給大家介紹了關(guān)于Python中eval()函數(shù)的詳細(xì)使用,需要的朋友可以參考下
    2022-07-07
  • python實(shí)現(xiàn)合并兩個(gè)排序的鏈表

    python實(shí)現(xiàn)合并兩個(gè)排序的鏈表

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)合并兩個(gè)排序的鏈表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Python爬蟲庫(kù)requests獲取響應(yīng)內(nèi)容、響應(yīng)狀態(tài)碼、響應(yīng)頭

    Python爬蟲庫(kù)requests獲取響應(yīng)內(nèi)容、響應(yīng)狀態(tài)碼、響應(yīng)頭

    上一節(jié)我們給大家介紹了Python爬蟲庫(kù)requests的發(fā)送請(qǐng)求傳參等使用方法,今天為大家介紹下requests獲取響應(yīng)內(nèi)容、響應(yīng)狀態(tài)碼、響應(yīng)頭等相關(guān)信息
    2020-01-01
  • python魔法方法之__setattr__()

    python魔法方法之__setattr__()

    這篇文章主要介紹了python魔法方法之__setattr__(),python提供了諸多的魔法方法,其中__setattr__()方法主要用于類實(shí)例進(jìn)行屬性賦值,接下來請(qǐng)和小編一起進(jìn)入文章來了解更多相關(guān)內(nèi)容吧
    2022-03-03

最新評(píng)論