最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQLAlchemy 2.0 類型注解指南之Mapped與mapped_column詳解

 更新時間:2025年12月30日 10:12:25   作者:nvd11  
SQLAlchemy 1.4和2.0引入了新的聲明式映射系統(tǒng),核心組件是Mapped類型注解和mapped_column構造函數,旨在提供更好的Python類型提示支持,本文介紹SQLAlchemy 2.0 類型注解指南之Mapped與mapped_column,感興趣的朋友跟隨小編一起看看吧

簡介

在 SQLAlchemy 1.4 和 2.0 中,ORM(對象關系映射)引入了一種新的聲明式映射系統(tǒng),核心組件是 Mapped 類型注解和 mapped_column 構造函數。這種新風格旨在提供更好的 Python 類型提示(Type Hinting)支持,解決舊版 Column 寫法在靜態(tài)代碼分析(如 Pyright, MyPy)和 IDE 自動補全方面的問題。

解決的問題

1. 靜態(tài)類型檢查報錯

這是最常見的問題。在舊版寫法中,模型屬性被定義為 Column 對象,例如:

id = Column(Integer, primary_key=True)

對于靜態(tài)分析工具(如 Pyright),id 的類型是 Column[Integer]。然而,當你實例化模型對象訪問 user.id 時,其實際值是 int 類型。

當你嘗試將 user.id 傳遞給一個期望 int 的函數時,Pyright 會報錯:

Argument of type “Column[Integer]” cannot be assigned to parameter of type “int”

Mapped 解決了這個問題。它明確告訴類型檢查器,雖然我們在類定義中使用了描述符,但在實例中該屬性表現(xiàn)為指定的 Python 類型。

2. IDE 智能感知

由于類型明確,現(xiàn)代 IDE(如 VS Code, PyCharm)能更準確地提供代碼補全和錯誤提示。例如,定義為 Mapped[str | None] 的字段,IDE 會提示你該字段可能為 None。

用法對比

1. 基本字段

舊寫法 (Legacy):

from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100))

新寫法 (Modern - SQLAlchemy 2.0+):

from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy import String
from typing import Optional
class User(Base):
    __tablename__ = "user"
    # Mapped[int] 告訴類型檢查器:實例中的 id 是 int 類型
    # mapped_column(...) 定義了數據庫列的屬性
    id: Mapped[int] = mapped_column(primary_key=True)
    # nullable=False 是默認的,對應 Mapped[str]
    name: Mapped[str] = mapped_column(String(50))
    # Optional[str] 或 str | None 對應 nullable=True
    email: Mapped[Optional[str]] = mapped_column(String(100))

2. 復雜類型 (UUID, DateTime)

舊寫法:

import uuid
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy import Column, DateTime, func
class Document(Base):
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    created_at = Column(DateTime(timezone=True), server_default=func.now())

新寫法:

import uuid
from datetime import datetime
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy import DateTime, func
class Document(Base):
    # 明確指定 id 是 uuid.UUID 類型
    id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    # 明確指定 created_at 是 datetime 類型
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())

3. 外鍵與關系

舊寫法:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class Post(Base):
    user_id = Column(Integer, ForeignKey("user.id"))
    user = relationship("User")

新寫法:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
class Post(Base):
    user_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
    # 這里的 relationship 也支持 Mapped 類型
    user: Mapped["User"] = relationship()

關鍵點總結

  1. 導入: 使用 from sqlalchemy.orm import Mapped, mapped_column
  2. 類型注解: 必須為每個列添加 Python 類型注解(如 : Mapped[int])。
  3. Nullable:
    • Mapped[str] 隱含 nullable=False。
    • Mapped[Optional[str]]Mapped[str | None] 隱含 nullable=True。
  4. SQL 類型: 在 mapped_column() 中通過第一個參數指定 SQL 類型(如 String(50)),如果類型可以從 Python 類型推斷(如 int -> Integer),則可以省略。但對于 String(需要長度)或 UUID 等特殊類型,通常還是需要指定。

通過采用這種新寫法,你的代碼將更加健壯,更易于維護,并且能通過嚴格的靜態(tài)類型檢查。

到此這篇關于SQLAlchemy 2.0 類型注解指南:`Mapped` 與 `mapped_column`的文章就介紹到這了,更多相關SQLAlchemy 2.0 類型注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現(xiàn)將漢字轉換成漢語拼音的庫

    python實現(xiàn)將漢字轉換成漢語拼音的庫

    這篇文章主要介紹了python實現(xiàn)將漢字轉換成漢語拼音的庫,涉及Python調用word.data字段實現(xiàn)將漢字轉換成拼音的功能,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • python使用matplotlib庫生成隨機漫步圖

    python使用matplotlib庫生成隨機漫步圖

    這篇文章主要為大家詳細介紹了使用Python的matplotlib庫生成隨機漫步圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python使用Tesseract實現(xiàn)從圖像中讀取文本

    Python使用Tesseract實現(xiàn)從圖像中讀取文本

    Tesseract?是一個基于計算機的系統(tǒng),用于光學字符識別?(OCR)?和其他圖像到文本處理,本文將介紹如何使用?Python?中的?Tesseract?創(chuàng)建一個可以從圖像中讀取文本的程序,需要的可以參考下
    2023-11-11
  • keras的backend 設置 tensorflow,theano操作

    keras的backend 設置 tensorflow,theano操作

    這篇文章主要介紹了keras的backend 設置 tensorflow,theano操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python之multimethod包多分派解讀

    python之multimethod包多分派解讀

    這篇文章主要介紹了python之multimethod包多分派問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Pytorch 定義MyDatasets實現(xiàn)多通道分別輸入不同數據方式

    Pytorch 定義MyDatasets實現(xiàn)多通道分別輸入不同數據方式

    今天小編就為大家分享一篇Pytorch 定義MyDatasets實現(xiàn)多通道分別輸入不同數據方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Pyspark獲取并處理RDD數據代碼實例

    Pyspark獲取并處理RDD數據代碼實例

    這篇文章主要介紹了Pyspark獲取并處理RDD數據代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Python中unittest用法實例

    Python中unittest用法實例

    這篇文章主要介紹了Python中unittest用法,較為詳細的講述了unittest中相關函數的用法及完整實例,需要的朋友可以參考下
    2014-09-09
  • Python裝飾器實現(xiàn)幾類驗證功能做法實例

    Python裝飾器實現(xiàn)幾類驗證功能做法實例

    下面小編就為大家?guī)硪黄狿ython裝飾器實現(xiàn)幾類驗證功能做法實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • python利用opencv保存、播放視頻

    python利用opencv保存、播放視頻

    這篇文章主要介紹了python利用opencv保存、播放視頻,幫助大家更好的利用python處理視頻,感興趣的朋友可以了解下
    2020-11-11

最新評論

全南县| 潜江市| 四川省| 交口县| 高唐县| 香港 | 广平县| 关岭| 缙云县| 清丰县| 达日县| 通州市| 罗田县| 华坪县| 平定县| 福建省| 同江市| 阿克苏市| 临江市| 通榆县| 榆树市| 隆德县| 环江| 宕昌县| 佛坪县| 甘谷县| 麦盖提县| 柳州市| 公安县| 仙居县| 沅陵县| 景德镇市| 乌审旗| 岳池县| 广西| 云浮市| 伊金霍洛旗| 吕梁市| 唐河县| 邯郸市| 平顶山市|