SQLAlchemy系列教程:理解SQLAlchemy元數據

SQLAlchemy是Python開發人員的強大ORM工具。SQLAlchemy中的元數據是對象-關系映射配置的集合,允許開發人員無縫地定義和使用數據庫模式。
在這里插入圖片描述

使用元數據

SQLAlchemy中的元數據充當各種數據庫描述符(如表、列和索引)的容器。這使開發人員能夠通過高級Python構造生成和管理數據庫結構。讓我們通過實際示例探索如何在SQLAlchemy中使用元數據。

基本用法

from sqlalchemy import MetaData, Table, Column, Integer, Stringmetadata = MetaData()
users_table = Table('users', metadata,Column('id', Integer, primary_key=True),Column('name', String)
)

在上面的代碼片段中,我們在MetaData實例中創建了一個Table對象,定義了一個帶有ID和名稱的簡單users表。

抽取現有數據庫模式

from sqlalchemy import create_engine, MetaDataengine = create_engine('sqlite:///example.db')
metadata = MetaData()
metadata.reflect(bind=engine)for table_name in metadata.tables:print(table_name)

這個示例演示了如何將現有數據庫模式加載到元數據對象中,以便在SQLAlchemy中進行自省或交互。

定義關系

from sqlalchemy import ForeignKeyaddresses_table = Table('addresses', metadata,Column('id', Integer, primary_key=True),Column('user_id', None, ForeignKey('users.id')),Column('email', String, nullable=False)
)

在這里,我們定義了用戶和地址之間的一對多關系,其中每個地址通過外鍵與用戶相關聯。

SQLAlchemy使用元數據

from sqlalchemy.orm import mapper, sessionmakerclass User(object):passmapper(User, users_table)
Session = sessionmaker(bind=engine)
session = Session()new_user = User()
new_user.id = 1
new_user.name = 'John Doe'
session.add(new_user)
session.commit()

上面的例子將一個Python類映射到定義的users表,并演示了使用ORM會話插入一條新記錄。

mapper 的作用:
  • 對象關系映射(ORM)mapper 函數用于將 Python 類(如 User)與數據庫表(如 users_table)進行映射。這樣,你可以通過操作 Python 對象來間接操作數據庫表中的數據。
  • 屬性關聯:通過映射,User 類的實例將對應 users 表中的行,類的屬性(如 idname)將對應表的列。
現代 SQLAlchemy 的推薦做法:

在現代 SQLAlchemy(版本 1.4 及以上)中,推薦使用 Declarative 擴展來進行 ORM 映射,而不是直接使用 mapper。Declarative 提供了更簡潔和直觀的方式來定義模型類。

使用 Declarative 的示例:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmakerBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)# 創建引擎和會話
engine = create_engine('sqlite:///example.db', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

這種方式自動處理了映射過程,減少了樣板代碼,使代碼更簡潔易讀。

高級元數據用法

可以自定義SQLAlchemy的元數據,以利用命名約定、顯式模式和高級數據類型。它還可以用于動態生成表和查詢元數據屬性。

metadata = MetaData(naming_convention={"ix": 'ix_%(column_0_label)s',"uq": "uq_%(table_name)s_%(column_0_name)s","ck": "ck_%(table_name)s_%(constraint_name)s","fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s","pk": "pk_%(table_name)s"
})

這個例子展示了索引、唯一約束、檢查約束、外鍵和主鍵的自定義命名約定。

從元數據生成DDL

metadata.create_all(engine)

create_all方法為元數據實例中包含的所有表和約束向數據庫發出適當的DDL命令。

實戰案例

在實際項目中,使用 SQLAlchemy 進行數據庫操作時,以下是一些最佳實踐:

a. 使用 Declarative 定義模型

如上所示,使用 Declarative 擴展定義模型類,不僅簡化了代碼,還提高了可維護性。

b. 分離模型、數據庫引擎和會話管理

將模型定義、數據庫引擎的創建和會話管理分離到不同的模塊中,有助于組織代碼,增強可重用性和可測試性。

示例結構:

project/
│
├── models.py          # 定義模型類
├── database.py        # 創建引擎和會話
└── main.py            # 主程序邏輯

models.py:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, StringBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)

database.py:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import BaseDATABASE_URL = "sqlite:///example.db"engine = create_engine(DATABASE_URL, echo=True)
SessionLocal = sessionmaker(bind=engine)def init_db():Base.metadata.create_all(bind=engine)

main.py:

from database import SessionLocal, init_db
from models import Userdef main():init_db()session = SessionLocal()new_user = User(name='John Doe')session.add(new_user)session.commit()session.close()if __name__ == "__main__":main()

一般開發階段通過init_db()創建表,在生產環境中,建議在部署腳本或初始化流程中手動創建表,以確保數據庫結構的可控性和一致性。此外,可以使用遷移工具(如 Alembic)來管理數據庫模式的變更。

最后總結

SQLAlchemy Metadata提供了一個健壯的接口,可以在Python環境中處理數據庫的模式。通過提供的示例,我們探索了元數據的基本概念,以及如何利用它們來簡化數據庫操作。

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

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

相關文章

MacDroid for Mac v2.3 安卓手機文件傳輸助手 支持M、Intel芯片 4.7K

MacDroid 是Mac毒搜集到的一款安卓手機文件傳輸助手,在Mac和Android設備之間傳輸文件。您只需要將安卓手機使用 USB 連接到 Mac 電腦上即可將安卓設備掛載為本地磁盤,就像編輯mac磁盤上的文件一樣編輯安卓設備上的文件,MacDroid支持所有 Andr…

Android+SpringBoot的老年人健康飲食小程序平臺

感興趣的可以先收藏起來,還有大家在畢設選題,項目以及論文編寫等相關問題都可以給我留言咨詢,我會一一回復,希望幫助更多的人。 系統介紹 我將從經濟、生活節奏、技術融合等方面入手,詳細闡述居家養老管理模式興起的…

【星云 Orbit ? STM32F4】10. 在串口接收中斷里即時解析數據頭的程序框架

【星云 Orbit ? STM32F4】10. 串口中斷中即時解析數據頭的程序開發:實現高效實時數據處理 摘要 在嵌入式開發中,串口中斷處理是實現高效實時數據傳輸的關鍵技術之一。本文將詳細介紹如何在STM32F407微控制器上開發一個在串口接收中斷中即時解析數據頭的…

數據倉庫的特點

數據倉庫的主要特點可以概括為:面向主題、集成性、非易失性、時變性、高性能和可擴展性、支持復雜查詢和分析、分層架構以及數據質量管理。 1. 面向主題(Subject-Oriented) 數據倉庫是面向主題的,而不是面向事務的。這意味著數據…

SAP MDG —— MDG on S/4HANA 2023 FPS03 創新匯總

文章目錄 MDG 基于SAP S/4HANA 2023 FPS03的創新BP/C/S:消息控制BP/C/S:手工分配數據控制者MDG-F:使用S/4擴展數據校驗功能生成式AI可用于協助自定義對象的數據變更/同時可總結批量變更的內容 MDG 基于SAP S/4HANA 2023 FPS03的創新 由于從S…

抽獎系統(從0-1)(上)

hu項目的開發流程介紹 1. 項目啟動階段 ? 項?概述:介紹項?的背景、?標和預期成果。 ? 團隊組建:建跨職能團隊,包括產品經理、UI/UX 設計師、開發?員、測試?員等。 ? ??定義:明確團隊中各個??的職責和?作內容。 2. 需…

vim 調整字體

vim: 在vim 面板單擊右鍵,選擇references: terminal :也是單擊右鍵,選擇references:

UniApp 使用 u-loadmore 完整步驟

文章目錄 一、前期準備1. 安裝 uView - UI 二、使用 u-loadmore組件1. 創建頁面2. 編寫頁面代碼模板部分(loadmore-demo.vue)樣式部分腳本部分 三、要點補充1. u-loadmore 狀態說明2. 數據請求優化3. 性能優化4. 兼容性問題 在 UniApp 開發中&#xff0c…

Libgdx游戲開發系列教程(3)——通過柏林噪音算法地圖隨機地形

在B站刷到了隨機地圖生成的視頻,隨手學習下并做下記錄 注: 本篇使用javafx應用作演示,算是了解這個算法的使用,后續會再出篇libgdx生成地圖的示例 說明 拋開算法實現,首先認知柏林噪音算法 一般我們想要隨機數,會指定個范圍,如0.0-1.0之間任意小數,而柏林算法的結果范圍就是[…

LeetCode熱題100JS(20/100)第四天|?41. 缺失的第一個正數?|?73. 矩陣置零?|?54. 螺旋矩陣?|?48. 旋轉圖像?

41. 缺失的第一個正數 題目鏈接:41. 缺失的第一個正數 難度:困難 刷題狀態:1刷 新知識: 解題過程 思考 示例 1: 輸入:nums [1,2,0] 輸出:3 解釋:范圍 [1,2] 中的數字都在數組中…

e2studio開發RA2E1(17)---- ADC掃描多通道采樣

e2studio開發RA2E1.17-- ADC掃描多通道采樣 概述視頻教學樣品申請硬件準備參考程序源碼下載ADC屬性配置回調函數主程序演示結果 概述 在嵌入式系統中,ADC(模數轉換器)是一個非常重要的組件,它將模擬信號轉換為數字信號。為了提高…

FPGA標準庫-Open Logic

在現代技術發展的浪潮中,開源項目已經成為了推動技術創新和發展的核心力量。無論是人工智能、區塊鏈、云計算,還是傳統的嵌入式開發、操作系統,開源項目都在其中扮演著至關重要的角色。它們不僅促進了技術的快速迭代,也為全球開發…

FineReport 操作注意

1.父單元格重復的時候,如何取消合并 效果如下: 只需要在單元格中,將數據設置為【列表】即可。 2.待定

開源之夏經驗分享|Koupleless 社區黃興抗:在開源中培養工程思維

開源之夏經驗分享|Koupleless 社區黃興抗:在開源中培養工程思維 文|黃興抗 電子信息工程專業 Koupleless 社區貢獻者 就讀于南昌師范學院,電子信息工程專業的大三學生。 本文 2634 字,預計閱讀 7? 分鐘? 今天 SOFAStack 邀…

Ollama存在安全風險的情況通報及解決方案

據清華大學網絡空間測繪聯合研究中心分析,開源跨平臺大模型工具Ollama默認配置存在未授權訪問與模型竊取等安全隱患。鑒于目前DeepSeek等大模型的研究部署和應用非常廣泛,多數用戶使用Ollama私有化部署且未修改默認配置,存在數據泄露、算力盜…

線代[9]|線性代數主要內容及其發展簡史(任廣千《線性代數的幾何意義》的附錄1)

文章目錄 向量行列式矩陣線性方程組二次型 向量 向量又稱為矢量,最初應用與物理學。很多物理量如力、速度、位移以及電場強度、磁感應強度等等都是向量。大約公元前350年前,古希臘著名學者亞里士多德就知道了力可以表示成向量,兩個力的組合作…

H20半精度推理報錯:Floating point exception (core dumped)

Nvidia H20 顯卡在執行bf16,f16推理時程序異常中斷 時間是 2025年3月4日 課題組新到的8卡H20服務器在使用過程中,torch加載模型進行bf16的推理時,出現Floating point exception (core dumped)錯誤 當時一頭霧水,后來苦苦尋找&…

服務是否設置為開機自啟動

在 Linux 系統中,可以通過以下幾種方法檢查服務是否設置為開機自啟動: 方法 1:使用 systemctl 命令(適用于 systemd 系統) systemctl 是 systemd 系統的命令行工具,用于管理系統服務。以下是具體步驟&…

QT——基于 QListWidget 和 QStackedWidget 的頁面切換

Qt 練習題:基于 QListWidget 和 QStackedWidget 的頁面切換 Qt 練習題:基于 QListWidget 和 QStackedWidget 的頁面切換 題目描述: 請使用 Qt 設計一個窗口,其中包含一個 QListWidget 和一個 QStackedWidget。要求實現以下功能&a…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)示例2: 分頁和排序

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 ?? 目錄 DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)示例2: 分頁和排序??前言??頁面效果??指令…