【100天精通python】Day34:使用python操作數據庫_ORM(SQLAlchemy)使用

目錄

?專欄導讀?

1?ORM 概述

2?SQLAlchemy 概述

3 ORM:SQLAlchemy使用

?3.1?安裝SQLAlchemy:

3.2 定義數據庫模型類:

3.3 創建數據表:

3.4 插入數據:

?3.5?查詢數據:

3.6 更新數據:

3.7 刪除數據:

3.8??關閉會話:

4? 實戰

??設計一個簡單的圖書管理系統。


?專欄導讀?

專欄訂閱地址:https://blog.csdn.net/qq_35831906/category_12375510.html


1?ORM 概述

????????ORM(對象關系映射)是一種編程技術,用于在關系型數據庫和面向對象編程語言之間建立映射關系,使得數據庫中的表和記錄可以映射到編程語言中的對象和類。ORM的目標是簡化數據庫操作,使開發人員能夠以面向對象的方式處理數據庫。

????????在Python中,有多個ORM庫可用,其中最知名的是SQLAlchemy。SQLAlchemy提供了一種將Python對象與數據庫表之間建立映射關系的方式,允許開發人員使用Python類來操作數據庫。

ORM的優勢包括:

  1. 抽象化數據庫操作:ORM隱藏了底層數據庫的細節,開發人員可以更專注于業務邏輯,而不需要編寫復雜的SQL查詢。

  2. 面向對象編程:ORM允許開發人員使用面向對象的方式處理數據,使得代碼更加清晰、可維護。

  3. 跨數據庫支持:ORM庫通常提供了跨多種數據庫的支持,開發人員可以輕松切換數據庫而不需要更改大量代碼。

  4. 自動建表和遷移:ORM庫可以自動根據定義的Python類生成數據庫表,并支持數據庫遷移。

  5. 查詢生成器:ORM庫通常提供了查詢生成器,使得編寫查詢更加簡單和直觀。

  6. 事務管理:ORM庫可以幫助管理事務,確保數據的一致性和完整性。

2?SQLAlchemy 概述

????????SQLAlchemy是一個強大的Python SQL工具包和對象關系映射(ORM)庫,它允許開發人員使用Python編程語言與關系型數據庫進行交互。SQLAlchemy提供了一種靈活且強大的方式來執行SQL查詢、插入、更新、刪除等操作,同時還支持將數據庫表映射到Python類,使開發人員可以以面向對象的方式操作數據庫。

以下是SQLAlchemy的主要特點和概述:

  1. ORM功能:SQLAlchemy的核心特點之一是其ORM功能。它允許你通過定義Python類來映射數據庫表和記錄,將數據庫操作轉化為面向對象的操作,使代碼更加直觀和易于維護。

  2. 多種數據庫支持:SQLAlchemy支持多種關系型數據庫,包括MySQL、SQLite、PostgreSQL、Oracle等,允許開發人員在不同數據庫之間切換而無需更改大部分代碼。

  3. 靈活性:SQLAlchemy提供了多種方式來執行SQL操作,包括原始SQL查詢、查詢生成器以及ORM查詢。這使得開發人員可以根據需求選擇適合的方式。

  4. 連接池管理:SQLAlchemy支持連接池管理,可以在應用程序和數據庫之間維護一組數據庫連接,提高性能和效率。

  5. 事務管理:SQLAlchemy允許你使用事務管理來確保數據庫操作的一致性和完整性,可以提交、回滾和中斷事務。

  6. 數據庫遷移:SQLAlchemy提供了Alembic工具,用于數據庫遷移和版本管理,使得對數據庫結構的變更更加可控。

  7. 多種關聯:SQLAlchemy支持多種關聯類型,如一對多、多對多等關聯關系,使數據庫之間的關系更加清晰。

  8. 跨表查詢:SQLAlchemy允許在ORM查詢中執行跨表聯接,從而實現復雜的查詢操作。

  9. 性能優化:SQLAlchemy提供了各種性能優化選項,如緩存、批量操作等,以提升大規模數據處理的效率。

  10. 豐富的文檔和社區支持:SQLAlchemy擁有豐富的官方文檔和活躍的社區,使得學習和解決問題變得更加容易。

????????總之,SQLAlchemy是一個強大的Python數據庫工具包,適用于各種規模的項目,從小型應用到大型企業級系統。它的靈活性、面向對象的設計和多種功能使得它成為Python開發人員進行數據庫操作的首選工具之一。

3 ORM:SQLAlchemy使用

????????當使用Python中的ORM(例如SQLAlchemy)時,你可以通過創建Python類來定義數據庫模型,然后使用這些模型對象來執行數據庫操作。以下是使用SQLAlchemy的詳細示例:

3.1?安裝SQLAlchemy

首先,你需要安裝SQLAlchemy庫。你可以使用以下命令在終端中安裝它:

pip install sqlalchemy

3.2 定義數據庫模型類

創建一個Python類來定義數據庫模型。每個類表示一個表,類的屬性表示表的列。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base# 創建數據庫連接
engine = create_engine('sqlite:///example.db')
Base = declarative_base()# 定義模型類
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)

3.3 創建數據表

通過調用create_all()方法創建數據庫表。

Base.metadata.create_all(engine)

3.4 插入數據

創建一個模型對象,然后將其添加到會話中并提交。

from sqlalchemy.orm import sessionmaker# 創建會話
Session = sessionmaker(bind=engine)
session = Session()# 添加數據
new_user = User(name='Alice', age=25)
session.add(new_user)
session.commit()

?3.5?查詢數據

使用會話查詢模型對象。

# 查詢數據
user = session.query(User).filter_by(name='Alice').first()
if user:print("User found:", user.name, user.age)
else:print("User not found")

3.6 更新數據

可以更新模型對象的屬性,然后提交會話來更新數據庫。

user.age = 26
session.commit()

3.7 刪除數據

使用delete()方法刪除模型對象,然后提交會話。

session.delete(user)
session.commit()

3.8??關閉會話

記得在完成操作后關閉會話。

session.close()

4? 實戰

??設計一個簡單的圖書管理系統。

以下是一個使用SQLAlchemy的圖書管理系統的完整示例:?

確保已安裝sqlalchemy,? pip install sqlalchemy

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base# 創建數據庫連接
engine = create_engine('sqlite:///library.db')
Base = declarative_base()# 定義作者模型類
class Author(Base):__tablename__ = 'authors'id = Column(Integer, primary_key=True)name = Column(String)# 定義圖書模型類
class Book(Base):__tablename__ = 'books'id = Column(Integer, primary_key=True)title = Column(String)author_id = Column(Integer, ForeignKey('authors.id'))# 創建數據表
Base.metadata.create_all(engine)# 創建會話
Session = sessionmaker(bind=engine)
session = Session()# 添加作者
author1 = Author(name='J.K. Rowling')
author2 = Author(name='George Orwell')session.add_all([author1, author2])
session.commit()# 添加圖書
book1 = Book(title='Harry Potter and the Sorcerer\'s Stone', author_id=author1.id)
book2 = Book(title='1984', author_id=author2.id)session.add_all([book1, book2])
session.commit()# 查詢數據
print("Authors:")
authors = session.query(Author).all()
for author in authors:print("Author:", author.name)selected_author = session.query(Author).filter_by(name='J.K. Rowling').first()
if selected_author:print("\nBooks by", selected_author.name)books = session.query(Book).filter_by(author_id=selected_author.id).all()for book in books:print("Book:", book.title)# 關閉會話
session.close()

上述代碼示例演示了如何使用SQLAlchemy庫創建一個簡單的圖書管理系統。

  1. 導入所需模塊:代碼開始時導入了所需的SQLAlchemy模塊,包括創建引擎、定義模型類、創建數據表和會話等。

  2. 創建數據庫連接和基類:使用create_engine函數創建了SQLite數據庫連接,然后通過declarative_base創建了一個基類Base

  3. 定義模型類:定義了兩個模型類,即Author(作者)和Book(圖書)。每個類對應一個表,類的屬性對應表的列。

  4. 創建數據表:通過調用Base.metadata.create_all(engine)方法,基于模型類創建了數據庫中的數據表。

  5. 創建會話:使用sessionmaker創建了一個會話類Session,然后通過Session()創建了一個會話實例session

  6. 添加數據:創建了兩個作者實例,使用session.add_all()將其添加到會話中,并通過session.commit()提交到數據庫。

  7. 查詢數據:使用session.query()查詢了作者和圖書信息,并進行了打印輸出。

  8. 關閉會話:在所有操作完成后,通過session.close()關閉了會話,釋放資源。

總體而言,這個示例展示了如何使用SQLAlchemy來創建數據庫模型、執行數據庫操作、查詢數據以及關閉會話。通過使用ORM,你可以將數據庫操作轉化為面向對象的方式,使代碼更加清晰、可維護。你可以根據需求進一步擴展這個示例,添加更多功能和復雜性。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++中volatile關鍵字詳解

1. 為什么用volatile? C/C 中的 volatile 關鍵字和 const 對應,用來修飾變量,通常用于建立語言級別的 memory barrier。這是 BS 在 "The C Programming Language" 對 volatile 修飾詞的說明: A volatile specifier is a hint to a…

【Git】 git push origin master Everything up-to-date報錯

hello,我是索奇,可以叫我小奇 git push 出錯?顯示 Everything up-to-date 那么看看你是否提交了message 下面是提交的簡單流程 git add . git commit -m "message" git push origin master 大多數伙伴是沒寫git commit -m "…

AI自動駕駛

AI自動駕駛 一、自動駕駛的原理二、自動駕駛的分類三、自動駕駛的挑戰四、自動駕駛的前景五、關鍵技術六、自動駕駛的安全問題七、AI數據與自動駕駛八、自動駕駛的AI算法總結 自動駕駛技術是近年來備受關注的熱門話題。它代表了人工智能和機器學習在汽車行業的重要應用。本文將…

UML之四種事物

目錄 結構事物 行為事物 分組事物: 注釋事物 結構事物 1.類(Class) -類是對一組具有相同屬性、方法、關系和語義的對象的描述。一個類實現一個或多個接口 2.接口(interface) -接口描述 了一個類或構件的一個服務的操作集。接口僅僅是定義了一組操作的規范&…

案例16 基于Spring Boot實現學生新增案例

基于Spring Boot實現學生新增。 1. 創建Spring Boot項目 創建Spring Boot項目&#xff0c;項目名稱為case16-springboot-student01。 ? 2. 設置項目信息 ? 3. 選擇依賴 選擇Lombok ? 選擇Spring Web ? 4. 設置項目名稱 ? 5. Maven依賴 <?xml version"1.0&qu…

Nature子刊 |腸道宏病毒組揭示百歲老人長壽秘訣

發表期刊&#xff1a;nature microbiology 發表時間&#xff1a;2023 影響因子&#xff1a;28.3 DOI: 10.1038/s41564-023-01370-6 研究背景 衰老是一種不可逆轉的自然過程&#xff0c;隨著年齡的增長&#xff0c;機體諸多方面出現功能性下降&#xff0c;與衰老相關的疾病&a…

生成式AI顛覆傳統數據庫的十種方式

對于生成式AI的所有閃光點&#xff0c;這個新時代最大的轉變可能深埋在軟件堆棧中。AI算法正在不易覺察地改變一個又一個數據庫。他們正在用復雜、自適應且看似更直觀的AI新功能顛覆傳統數據庫。 目錄 1、向量和嵌入 2、查詢模型 3、建議 4、索引范例 5、數據分類 6、更…

Unity 框架學習--1

由淺入深&#xff0c;慢慢演化實現框架 兩個類的實現代碼完全一樣&#xff0c;就只有類名或類型不一樣的時候&#xff0c;而且還需要不斷擴展&#xff08;未來會增加各種事件&#xff09;的時候&#xff0c;這時候就用 泛型 繼承 來提取&#xff0c;繼承解決擴展的問題&#…

【RabbitMQ與SpringBoot集成測試收發消息】

【RabbitMQ與SpringBoot集成測試收發消息】 一、環境說明二、實驗步驟三、小結 一、環境說明 安裝環境&#xff1a;虛擬機VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本&#xff1a;rabbitmq-server-3.8.8-1.el7.noarch.rpm編程工具Idea 運行JDK為17 二、實驗步驟 在Rab…

List和數組互轉方法以及踩坑點

一、數組轉List 1. 使用for循環逐個添加 String[] arr {"A", "B", "C"}; List<String> list new ArrayList<>(); for (String element : arr) {list.add(element); }2. 使用Arrays.asList(arr) String[] arr {"A", …

TypeScript 泛型的深入解析與基本使用

系列文章目錄 文章目錄 系列文章目錄前言一、泛型的概念二、泛型函數三、泛型類四、泛型接口五、泛型約束總結前言 泛型是TypeScript中的一個重要概念,它允許我們在定義函數、類或接口時使用參數化類型,增強了代碼的靈活性和重用性。本文將深入探討泛型的概念,以及如何在Ty…

智能駕駛系列報告之一:智能駕駛 ChatGPT時刻有望來臨

原創 | 文 BFT機器人 L3 功能加速落地&#xff0c;政策標準有望明確 L2 發展日益成熟&#xff0c;L3 功能加速落地。根據市場監管總局發布的《汽車駕駛自動化分級》與 SAE發布的自動駕駛分級標準&#xff0c;自動駕駛主要分為 6 個級別&#xff08;0 級到 5 級&#xff0c;L0 …

Tomcat多實例部署及nginx+tomcat的負載均衡和動靜分離

Tomcat多實例部署 安裝 jdk、tomcat&#xff08;流程可看之前博客&#xff09; 配置 tomcat 環境變量 [rootlocalhost ~]# vim /etc/profile.d/tomcat.sh#tomcat1 export CATALINA_HOME1/usr/local/tomcat/tomcat1 export CATALINA_BASE1/usr/local/tomcat/tomcat1 export T…

Delphi調用WindowsAPI獲取窗口進程

Delphi有封裝的很好的WindowsAPI&#xff0c;直接調用即可&#xff0c;大體上和C差不多&#xff0c;有些地方需要額外處理。 給出一個實例&#xff1a; varg_process: THandle;procedure initGlobal(); beginvarg_handle: HWND;g_handle : FindWindow(clsName, name);if g_ha…

矩陣定理復習記錄

矩陣復習 矩陣導數定理 若A是一個如下矩陣&#xff1a; A [ a 11 a 12 a 21 a 22 ] A \begin{bmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix} A[a11?a21??a12?a22??] y是一個向量矩陣&#xff1a; y ? [ y 1 y 2 ] \vec{y}\begin{bmatrix}y_1\\y_2\e…

在vue項目使用數據可視化 echarts ,柱狀圖、折線圖、餅狀圖使用示例詳解及屬性詳解

官網地址&#xff1a;Apache ECharts ?一、下載插件并在頁面中引入 npm install echarts --save 頁面導入&#xff1a; import * as echarts from echarts 全局導入&#xff1a; main.js 中&#xff0c;導入并注冊到全局 import echarts from echarts Vue.prototype.$echart…

Clone函數

概述 Clone函數是一種用于復制的計算機函數。在程序編寫中&#xff0c;除了自定義一個拷貝構造函數來實現對象復制外&#xff0c;還可以實現一個clone函數。這需要借助編譯器實現的一個隱藏拷貝構造函數&#xff0c;這樣的做法&#xff0c;更省心。 中文名clone函數外文名clon…

C# 使用FFmpeg.Autogen對byte[]進行編解碼

C# 使用FFmpeg.Autogen對byte[]進行編解碼&#xff0c;參考&#xff1a;https://github.com/vanjoge/CSharpVideoDemo 入口調用類&#xff1a; using System; using System.IO; using System.Drawing; using System.Runtime.InteropServices; using FFmpeg.AutoGen;namespace F…

C++11異步與通信之 packaged_task

概念簡介 packaged_task 用于包裝可調用目標(Callable)為一個對象,如lambda&#xff0c;普通函數&#xff0c;小括號重載等&#xff0c;用于異步調用。 其返回值或所拋異常被存儲于能通過 std::future 對象訪問的共享狀態中&#xff0c;和promise類似。 將函數的調用與函數返…

時序預測 | MATLAB實現EEMD-LSTM、LSTM集合經驗模態分解結合長短期記憶神經網絡時間序列預測對比

時序預測 | MATLAB實現EEMD-LSTM、LSTM集合經驗模態分解結合長短期記憶神經網絡時間序列預測對比 目錄 時序預測 | MATLAB實現EEMD-LSTM、LSTM集合經驗模態分解結合長短期記憶神經網絡時間序列預測對比效果一覽基本介紹模型搭建程序設計參考資料 效果一覽 基本介紹 時序預測 | …