SQLAlchemy

https://docs.sqlalchemy.org.cn/en/20/orm/quickstart.htmlicon-default.png?t=O83Ahttps://docs.sqlalchemy.org.cn/en/20/orm/quickstart.html

聲明模型?

在這里,我們定義模塊級構造,這些構造將構成我們從數據庫中查詢的結構。這種結構被稱為?聲明式映射,它同時定義了 Python 對象模型以及?數據庫元數據,該元數據描述了在特定數據庫中存在或將存在的實際 SQL 表。

Base = declarative_base() 是 SQLAlchemy 中的一個關鍵語句,它用于定義一個基礎類(Base),所有 ORM 模型類都需要繼承這個基礎類。通過這種方式,SQLAlchemy 能夠將 Python 類與數據庫表結構建立映射關系。

from sqlalchemy.ext.declarative import declarative_base# 創建基礎類
Base = declarative_base()

實例代碼?

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 創建基礎類
Base = declarative_base()# 定義 ORM 模型類
class User(Base):__tablename__ = 'users'  # 映射到數據庫中的表名id = Column(Integer, primary_key=True)  # 定義主鍵name = Column(String(50))  # 定義列age = Column(Integer)# 創建數據庫引擎
engine = create_engine('sqlite:///:memory:')# 創建所有表
Base.metadata.create_all(engine)# 創建會話
Session = sessionmaker(bind=engine)
session = Session()# 插入數據
new_user = User(name='Alice', age=25)
session.add(new_user)
session.commit()# 查詢數據
user = session.query(User).filter_by(name='Alice').first()
print(user.name, user.age)  # 輸出: Alice 25

?SQLAlchemy 2.0

?SQLAlchemy 2.0 或更高版本,建議采用這種新形式來定義 ORM 模型類。

這是新版本的

class User(Base):__tablename__ = "user_account"id: Mapped[int] = mapped_column(primary_key=True)name: Mapped[str] = mapped_column(String(30))fullname: Mapped[Optional[str]]addresses: Mapped[List["Address"]] = relationship(back_populates="user", cascade="all, delete-orphan")

?這個是舊版本的

Base = declarative_base()# Step 3. 定義可以使用Base類管理的模型類
class Session(Base):"""Session 類表示聊天會話"""__tablename__ = "sessions"id = Column(Integer, primary_key=True)## unique=True表示 session_id 字段的值必須是唯一的,不能有重復值。 不能為空session_id = Column(String, unique=True, nullable=False)# 這不是數據庫中的一個具體字段,而是 ORM 層面的邏輯關系,用于簡化操作和查詢。messages = relationship("Message", back_populates="session")class Message(Base):"""Message 類表示會話中的各個消息"""__tablename__ = "messages"id = Column(Integer, primary_key=True)session_id = Column(Integer, ForeignKey("sessions.id"), nullable=False)role = Column(String, nullable=False)content = Column(Text, nullable=False)session = relationship("Session", back_populates="messages")

?安裝

?

?連接數據庫

?

?映射類

Base = declarative_base() 是 SQLAlchemy 中的一個關鍵語句,它用于定義一個基礎類(Base),所有 ORM 模型類都需要繼承這個基礎類。通過這種方式,SQLAlchemy 能夠將 Python 類與數據庫表結構建立映射關系。

?添加記錄

然后session.commit()?

?查詢

session = Session()# result = session.query(Person).all()
result = session.query(Person).filter(Person.address == 'aaa')for person in result:print(f'name: {person.name}, birthday: {person.birthday}')

?

# person = session.query(Person).filter(Person.address == 'aaa').first()
# person = session.query(Person).filter(Person.id == 100).first()
# person = session.query(Person).filter(Person.id == 1).one()
# 返回查詢結果的第一條記錄的第一列值。
person = session.query(Person).filter(Person.id == 1).scalar()

?修改記錄

記得提交事務

方式2修改時要傳json的表達式

新的映射

class User(Base):__tablename__ = "user_account"id: Mapped[int] = mapped_column(primary_key=True)name: Mapped[str] = mapped_column(String(30))fullname: Mapped[Optional[str]]addresses: Mapped[List["Address"]] = relationship(back_populates="user", cascade="all, delete-orphan")

?當一些字段重復是可以單獨定義出來

import datetimefrom sqlalchemy import create_engine, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Mapped, mapped_column
from sqlalchemy.sql import func
from typing_extensions import Annotatedengine = create_engine('mysql://root:test@localhost/testdb', echo=True)
Base = declarative_base()# 當很多字段都有統一的要求,就把他給單獨定義出來
int_pk = Annotated[int, mapped_column(primary_key=True)]
required_unique_name = Annotated[str, mapped_column(String(128), unique=True, nullable=False)]
timestamp_default_now = Annotated[datetime.datetime, mapped_column(nullable=False, server_default=func.now())]class Customer(Base):__tablename__ = "customers"id: Mapped[int_pk]name: Mapped[required_unique_name]birthday: Mapped[datetime.datetime]city: Mapped[str] = mapped_column(String(128), nullable=True)create_time: Mapped[timestamp_default_now]Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

?一對多的映射

一開始沒relationship

class Department(Base):__tablename__ = "department"id: Mapped[int_pk]name: Mapped[required_unique_name]def __repr__(self):return f'id: {self.id}, name: {self.name}'class Employee(Base):__tablename__ = "employee"id: Mapped[int_pk]dep_id: Mapped[int] = mapped_column(ForeignKey("department.id"))name: Mapped[required_unique_name]birthday: Mapped[timestamp_not_null]

?這樣會出錯,因為對象還沒真正存入數據庫,所以主鍵id就沒生成,可以采用 flush() 刷新進去,但是多了之后不知道哪里需要flush(),所以有了relationship

?

單純加上relationship這個就好,并且可以直接查看關聯的部門信息

class Department(Base):__tablename__ = "department"id: Mapped[int_pk]name: Mapped[required_unique_name]def __repr__(self):return f'id: {self.id}, name: {self.name}'class Employee(Base):__tablename__ = "employee"id: Mapped[int_pk]dep_id: Mapped[int] = mapped_column(ForeignKey("department.id"))name: Mapped[required_unique_name]birthday: Mapped[timestamp_not_null]department: Mapped[Department] = relationship()

?只加員工對象就可以,他會直接把部門對象也創建出來,依據有沒有id判斷是存在 還是不存在,

不存在就會創建

?并且可以直接查看部門信息

?

import datetimefrom sqlalchemy import create_engine, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Mapped, mapped_column, relationship
from typing_extensions import Annotated
from typing import Listengine = create_engine('mysql://root:test@localhost/testdb', echo=True)
Base = declarative_base()int_pk = Annotated[int, mapped_column(primary_key=True)]
required_unique_name = Annotated[str, mapped_column(String(128), unique=True, nullable=False)]
timestamp_not_null = Annotated[datetime.datetime, mapped_column(nullable=False)]class Department(Base):__tablename__ = "department"id: Mapped[int_pk]name: Mapped[required_unique_name]# 顯式的表示出來employees: Mapped[List["Employee"]] = relationship(back_populates="department")def __repr__(self):return f'id: {self.id}, name: {self.name}'class Employee(Base):__tablename__ = "employee"id: Mapped[int_pk]dep_id: Mapped[int] = mapped_column(ForeignKey("department.id"))name: Mapped[required_unique_name]birthday: Mapped[timestamp_not_null]# relationship 實際不存在表中,他只存在內存中,lazy=False表示取消懶加載 ,查詢的時候直接把另一個給查出來# back_populates="employees"  自動給department表增加一個映射employees,而且他是一個集合類型的 這個employees當前對應的就是這個表# 這個映射在department你看不見,但是為了可讀性直觀一些,我們會顯式的表示出來# 這樣定義完之后,我們就可以直接查看部分的信息了department: Mapped[Department] = relationship(lazy=False, back_populates="employees")def __repr__(self):return f'id: {self.id}, dep_id: {self.dep_id}, name: {self.name}, birthday: {self.birthday}'Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

多對多的映射

并不需要專門定義一個類,如果專門定義一個類,那么就成為了多個一對多的映射

這是聯合主鍵

?

import datetimefrom sqlalchemy import create_engine, String, ForeignKey, Table, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Mapped, mapped_column, relationship
from typing_extensions import Annotated
from typing import List, Setengine = create_engine('mysql://root:test@localhost/testdb', echo=True)
Base = declarative_base()int_pk = Annotated[int, mapped_column(primary_key=True)]
required_unique_name = Annotated[str, mapped_column(String(128), unique=True, nullable=False)]
required_string = Annotated[str, mapped_column(String(128), nullable=False)]# 多對多的中間表,不用聲明一個類
# 這是聯合主鍵
association_table = Table("user_role",Base.metadata,Column("user_id", ForeignKey("users.id"), primary_key=True),Column("role_id", ForeignKey("roles.id"), primary_key=True)
)class User(Base):__tablename__ = "users"id: Mapped[int_pk]name: Mapped[required_unique_name]password: Mapped[required_string]# secondary=association_table 指明中間表roles: Mapped[List["Role"]] = relationship(secondary=association_table, lazy=False, back_populates="users")def __repr__(self):return f'id: {self.id}, name: {self.name}'class Role(Base):__tablename__ = "roles"id: Mapped[int_pk]name: Mapped[required_unique_name]users: Mapped[List["User"]] = relationship(secondary=association_table, lazy=True, back_populates="roles")def __repr__(self):return f'id: {self.id}, name: {self.name}'Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
from db_init import Session, User, Roledef insert_records(s):role1 = Role(name="Admin")role2 = Role(name="Operator")user1 = User(name="Jack", password="111")user2 = User(name="Tom", password="222")user3 = User(name="Mary", password="333")# 用戶中添加角色user1.roles.append(role1)user1.roles.append(role2)user2.roles.append(role1)user3.roles.append(role2)s.add_all([user1, user2, user3])s.commit()def select_user(s):u = s.query(User).filter(User.id == 1).one()print(u)print(u.roles)def select_role(s):r = s.query(Role).filter(Role.id == 2).one()print(r)print(r.users)session = Session()
# insert_records(session)
# select_user(session)
select_role(session)

一對一的映射

import datetimefrom sqlalchemy import create_engine, String, ForeignKey, Table, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Mapped, mapped_column, relationship
from typing_extensions import Annotated
from typing import List, Setengine = create_engine('mysql://root:test@localhost/testdb', echo=True)
Base = declarative_base()int_pk = Annotated[int, mapped_column(primary_key=True)]
required_unique_string = Annotated[str, mapped_column(String(128), unique=True, nullable=False)]
required_string = Annotated[str, mapped_column(String(128), nullable=False)]class Employee(Base):__tablename__ = "employee"id: Mapped[int_pk]name: Mapped[required_unique_string]computer_id: Mapped[int] = mapped_column(ForeignKey("computer.id"), nullable=True)computer = relationship("Computer", lazy=False, back_populates="employee")def __repr__(self):return f'id: {self.id}, name: {self.name}'class Computer(Base):__tablename__ = "computer"id: Mapped[int_pk]model: Mapped[required_string]number: Mapped[required_unique_string]employee = relationship("Employee", lazy=True, back_populates="computer")def __repr__(self):return f'id: {self.id}, model: {self.model}, number: {self.number}'Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
from db_init import Session, Employee, Computerdef insert(s):c1 = Computer(model="Dell", number="1111")c2 = Computer(model="Surface", number="2222")c3 = Computer(model="MacBook Pro", number="3333")e1 = Employee(name="Jack", computer=c1)e2 = Employee(name="Mary", computer=c2)e3 = Employee(name="Tome", computer=c3)s.add_all([e1, e2, e3])s.commit()def select(s):e = s.query(Employee).filter(Employee.id == 1).scalar()if e:print(e)print(e.computer)c = s.query(Computer).filter(Computer.id == 2).scalar()if c:print(c)print(c.employee)def update_1(s):s.query(Employee).filter(Employee.id == 3).update({Employee.computer_id: None})s.commit()def update_2(s):c = s.query(Computer).filter(Computer.id == 3).scalar()e = s.query(Employee).filter(Employee.id == 3).scalar()if c and e:e.computer = cs.commit()session = Session()
# insert(session)
# select(session)
# update_1(session)
update_2(session)

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

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

相關文章

Trimble自動化激光監測支持歷史遺產實現可持續發展【滬敖3D】

故事橋(Story Bridge)位于澳大利亞布里斯班,建造于1940年,全長777米,橫跨布里斯班河,可載汽車、自行車和行人往返于布里斯班的北部和南部郊區。故事橋是澳大利亞最長的懸臂橋,是全世界兩座手工建…

CentOS 和 Ubantu你該用哪個

文章目錄 **一、CentOS 和 Ubuntu 的詳細介紹****1. CentOS****1.1 基本信息****1.2 特點****1.3 缺點** **2. Ubuntu****2.1 基本信息****2.2 特點****2.3 缺點** **二、CentOS 和 Ubuntu 的異同****1. 相同點****2. 不同點****3. 使用體驗對比** **三、總結和選擇建議** Cent…

Android RIL(Radio Interface Layer)全面概述和知識要點(3萬字長文)

在Android面試時,懂得越多越深android framework的知識,越為自己加分。 目錄 第一章:RIL 概述 1.1 RIL 的定義與作用 1.2 RIL 的發展歷程 1.3 RIL 與 Android 系統的關系 第二章:RIL 的架構與工作原理 2.1 RIL 的架構組成 2.2 RIL 的工作原理 2.3 RIL 的接口與協議…

前端學習-事件對象與典型案例(二十六)

目錄 前言 事件對象 目標 事件對象是什么 語法 獲取事件對象 部分常用屬性 示例代碼 示例代碼:評論回車發布 總結 前言 長風破浪會有時,直掛云帆濟滄海。 事件對象 目標 能說出什么是事件對象 事件對象是什么 也是個對象,這個對…

Playwright vs Selenium:全面對比分析

在現代軟件開發中,自動化測試工具在保證應用質量和加快開發周期方面發揮著至關重要的作用。Selenium 作為自動化測試領域的老牌工具,長期以來被廣泛使用。而近年來,Playwright 作為新興工具迅速崛起,吸引了眾多開發者的關注。那么…

Windows 程序設計3:寬窄字節的區別及重要性

文章目錄 前言一、寬窄字節簡介二、操作系統及VS編譯器對寬窄字節的編碼支持1. 操作系統2. 編譯器 三、寬窄字符串的優缺點四、寬窄字節數據類型總結 前言 Windows 程序設計3:寬窄字節的區別及重要性。 一、寬窄字節簡介 在C中,常用的字符串指針就是ch…

進階——十六屆藍橋杯嵌入式熟練度練習(LED的全開,全閉,點亮指定燈,交替閃爍,PWM控制LED呼吸燈)

點亮燈的函數 void led_show(unsigned char upled) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,upled<<8,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RE…

力扣 最大子數組和

動態規劃&#xff0c;前綴和&#xff0c;維護狀態更新。 題目 從題可以看出&#xff0c;找的是最大和的連續子數組&#xff0c;即一個數組中的其中一個連續部分。從前往后遍歷&#xff0c;每遍歷到一個數可以嘗試做疊加&#xff0c;注意是嘗試&#xff0c;因為有可能會遇到一個…

Homestyler 和 Tripo AI 如何利用人工智能驅動的 3D 建模改變定制室內設計

讓設計夢想照進現實 在Homestyler,我們致力于為每一個夢想設計師提供靈感的源泉,而非挫折。無論是初學者打造第一套公寓,或是專業設計師展示作品集,我們的直觀工具都能讓您輕松以驚人的3D形式呈現空間。 挑戰:實現定制設計的新紀元 我們知道,將個人物品如傳家寶椅子、…

如何當前正在運行的 Elasticsearch 集群信息

要查看當前正在運行的 Elasticsearch 集群信息&#xff0c;可以通過以下幾種方法&#xff1a; 1. 使用 _cluster/health API _cluster/health API 返回集群的健康狀態、節點數量、分片狀態等信息。可以用 curl 命令直接訪問&#xff1a; curl -X GET "http://localhost…

算法練習4——一個六位數

這道題特別妙 大家仔細做一做 我這里采用的是動態規劃來解這道題 結合題目要求找出數與數之間的規律 抽象出狀態轉移方程 題目描述 有一個六位數&#xff0c;其個位數字 7 &#xff0c;現將個位數字移至首位&#xff08;十萬位&#xff09;&#xff0c;而其余各位數字順序不…

client-go 的 QPS 和 Burst 限速

1. 什么是 QPS 和 Burst &#xff1f; 在 kubernetes client-go 中&#xff0c;QPS 和 Burst 是用于控制客戶端與 Kubernetes API 交互速率的兩個關鍵參數&#xff1a; QPS (Queries Per Second) 定義&#xff1a;表示每秒允許發送的請求數量&#xff0c;即限速器的平滑速率…

B-tree 數據結構詳解

1. 引言 1.1 什么是 B-tree&#xff1f; B-tree&#xff08;Balanced Tree&#xff0c;平衡樹&#xff09;是一種自平衡的多路搜索樹數據結構&#xff0c;其核心特性包括&#xff1a; 多路性&#xff1a; 每個節點可以包含多個關鍵字和子節點&#xff0c;而非僅二分。平衡性…

Python 正則表達式完全指南

# Python 正則表達式完全指南 正則表達式&#xff08;Regular Expression&#xff09;是Python中進行文本處理的強大工具。本指南將詳細介紹Python中正則表達式的使用方法和實踐技巧。 ## 1. 基礎知識 ### 1.1 導入正則表達式模塊 python import re ### 1.2 創建正則表達式 在…

Vue的scoped原理是什么

CSS常見模塊化方案 BEM&#xff08;Block Element Modifier&#xff09;: BEM是一種流行的命名約定&#xff0c;它通過特定的命名規則來組織CSS類名&#xff0c;使得樣式具有模塊化、可重用性和可讀性。BEM的命名規則是&#xff1a;block__element--modifier。 block&#xf…

【LC】3270. 求出數字答案

題目描述&#xff1a; 給你三個 正 整數 num1 &#xff0c;num2 和 num3 。 數字 num1 &#xff0c;num2 和 num3 的數字答案 key 是一個四位數&#xff0c;定義如下&#xff1a; 一開始&#xff0c;如果有數字 少于 四位數&#xff0c;給它補 前導 0 。答案 key 的第 i 個數…

太原理工大學軟件設計與體系結構 --javaEE

這個是簡答題的內容 選擇題的一些老師會給你們題庫&#xff0c;一些注意的點我會做出文檔在這個網址 項目目錄預覽 - TYUT復習資料:復習資料 - GitCode 希望大家可以給我一些打賞 什么是Spring的IOC和DI IOC 是一種設計思想&#xff0c;它將對象的創建和對象之間的依賴關系…

深度學習知識點:LSTM

文章目錄 1.應用現狀2.發展歷史3.基本結構4.LSTM和RNN的差異 1.應用現狀 長短期記憶神經網絡&#xff08;LSTM&#xff09;是一種特殊的循環神經網絡(RNN)。原始的RNN在訓練中&#xff0c;隨著訓練時間的加長以及網絡層數的增多&#xff0c;很容易出現梯度爆炸或者梯度消失的問…

mmdet

一&#xff0c;configs/_base_ 1.default_runtime.py 2.schedule_1x.py 二&#xff0c;mmdet 1.datasets/coco.py/CocoDataset METAINFO {classes:(milk, red, spring, fanta, sprite, pepsi, king, ice, cola, scream ),# palette is a list of color tuples, which is us…

ElasticSearch 認識和安裝ES

文章目錄 一、為什么學ElasticSearch?1.ElasticSearch 簡介2.ElasticSearch 與傳統數據庫的對比3.ElasticSearch 應用場景4.ElasticSearch 技術特點5.ElasticSearch 市場表現6.ElasticSearch 的發展 二、認識和安裝ES1.認識 Elasticsearch&#xff08;簡稱 ES&#xff09;2.El…