SQLModel – 基于Pydantic的Python ORM库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

简介

SQLAlchemy和Pydantic是Python开发者手中的两大利器:一个负责数据库交互,另一个专攻数据验证。但两者之间始终存在鸿沟。SQLModel应运而生——这是一款基于Pydantic的ORM库,完美融合了两者的优势。

SQLModel允许您将类型化的Pydantic模型直接用作SQLAlchemy的ORM表。这简化了开发流程,加速了API构建,并消除了数据库模型与序列化器之间的代码重复。

什么是SQLModel?为何需要它?

SQLModel是Python的现代ORM库,由FastAPI创始人Sebastián Ramírez于2021年创建。它解决了Web开发中的核心痛点——数据库模型与数据验证模式之间的代码重复问题。

SQLModel的核心优势

SQLModel为开发者提供了统一的数据库操作与数据验证接口。主要优势包括:

  • 统一数据模型:一个模型同时服务于数据库和API
  • 自动验证:内置Pydantic数据验证机制
  • 类型安全:全面支持Python类型提示和IDE智能提示
  • 高度兼容:无缝对接现有SQLAlchemy项目
  • 异步支持:开箱即用的async/await支持

安装与配置

基础安装

pip install sqlmodel

安装附加依赖

如需使用PostgreSQL:

pip install sqlmodel[postgresql]

如需异步操作:

pip install sqlmodel[async]

完整安装(包含所有依赖):

pip install "sqlmodel[postgresql,async]"

连接数据库

from sqlmodel import SQLModel, create_engine

# SQLite(开发环境)
engine = create_engine("sqlite:///database.db")

# PostgreSQL
engine = create_engine("postgresql://user:password@localhost/dbname")

# MySQL
engine = create_engine("mysql+pymysql://user:password@localhost/dbname")

SQLModel基础操作

创建基础模型

from sqlmodel import SQLModel, Field
from typing import Optional

class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str = Field(index=True)
    email: str = Field(unique=True)
    age: int = Field(ge=0, le=150)
    is_active: bool = Field(default=True)

Field参数详解

SQLModel在Pydantic的Field基础上扩展了更多功能:

class Product(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str = Field(max_length=100, index=True)
    price: float = Field(gt=0, description="商品价格")
    category_id: int = Field(foreign_key="category.id")
    created_at: datetime = Field(default_factory=datetime.now)

在数据库中创建表

from sqlmodel import SQLModel, create_engine

engine = create_engine("sqlite:///database.db")

# 创建所有表
SQLModel.metadata.create_all(engine)

# 创建指定表
User.metadata.create_all(engine)

SQLModel的CRUD操作

创建记录

from sqlmodel import Session

# 创建单条记录
user = User(name="小明", email="xiaoming@example.com", age=25)

with Session(engine) as session:
    session.add(user)
    session.commit()
    session.refresh(user)  # 从数据库获取ID
    print(f"已创建                    

推荐