在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;
設(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
使用 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")
輸出:
創(chuàng)建所需的表
要使用 Python 查詢 PostgreSQL 視圖,我們首先需要數(shù)據(jù)庫(kù)中存在一些數(shù)據(jù),但目前數(shù)據(jù)庫(kù)中還沒有
在將一些數(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)
輸出:
將數(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ù)返回的視圖中的所有行,
如果我們檢查數(shù)據(jù)庫(kù),數(shù)據(jù)已插入到 demo_view 表中,
使用 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ù)。
使用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 中的唯一名稱。
使用 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 列排序的行。
使用 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 列中的值的總和。
使用 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列值的平均值。
使用 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ù)。
使用 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 列的最小值。
使用 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 列的最大值。
使用“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 中名稱列值與給定列表中的任何值匹配的行。
使用“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)
輸出:
使用“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)
輸出 :
以上就是在python中使用SQLAlchemy查詢PostgreSQL視圖的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于python SQLAlchemy查詢PostgreSQL視圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python創(chuàng)建文本文件的簡(jiǎn)單方法
在本篇內(nèi)容里小編給大家整理分享的是一篇關(guān)于python創(chuàng)建文本文件的簡(jiǎn)單方法,有需要的朋友們可以參考學(xué)習(xí)下。2020-08-08tensorflow中tf.reduce_mean函數(shù)的使用
這篇文章主要介紹了tensorflow中tf.reduce_mean函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04python?使用turtle實(shí)現(xiàn)實(shí)時(shí)鐘表并生成exe
這篇文章主要為大家詳細(xì)介紹了python使用Turtle庫(kù)繪制動(dòng)態(tài)鐘表,并有需要可以生成exe可執(zhí)行文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Python Collections強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)工具使用實(shí)例探索
這篇文章主要介紹了Python Collections強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)工具的使用實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python中eval()函數(shù)的詳細(xì)使用教程
eval函數(shù)在Python中具有非常重要的地位,熟練的使用eval函數(shù)能夠?yàn)槲覀兊腜ython編程提供很多的便利之處,下面這篇文章主要給大家介紹了關(guān)于Python中eval()函數(shù)的詳細(xì)使用,需要的朋友可以參考下2022-07-07python實(shí)現(xiàn)合并兩個(gè)排序的鏈表
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)合并兩個(gè)排序的鏈表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03Python爬蟲庫(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