简介
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"已创建