0%

SQLModel自学教程(1) - 数据库安装

1.安装核心步骤

graph TD
    A[创建项目目录] --> B[创建虚拟环境]
    B --> C[激活虚拟环境]
    C --> D[安装SQLModel]
    D --> E[验证安装]
  • 支持Python 3.7+环境
  • 自动安装依赖项(SQLAlchemy和Pydantic)

2.完整安装命令

1
2
3
4
5
6
7
8
# 创建并激活虚拟环境(Linux/macOS)
$ python -m venv sqlmodel-env
$ source sqlmodel-env/bin/activate

# 安装SQLModel
(sqlmodel-env) $ pip install sqlmodel
---> 100%
Successfully installed sqlmodel pydantic sqlalchemy
  • 推荐使用虚拟环境隔离项目依赖
  • Windows系统激活命令:.\sqlmodel-env\Scripts\activate.bat

3.数据库工具推荐

1
2
3
4
5
from sqlmodel import SQLModel, create_engine

# SQLite连接示例
engine = create_engine("sqlite:///database.db")
SQLModel.metadata.create_all(engine)
  • 支持多种数据库引擎:SQLite/MySQL/PostgreSQL
  • create_engine 参数说明:
    • echo=True 开启SQL语句日志
    • 不同数据库连接格式:
      1
      2
      3
      4
      # MySQL
      "mysql+pymysql://user:pass@localhost/db"
      # PostgreSQL
      "postgresql://user:pass@localhost/db"

4.安装验证方法

1
2
import sqlmodel
print(sqlmodel.__version__) # 应输出类似0.1.0的版本号
  • 检查已安装的依赖:
    1
    $ pip list | grep -E 'sqlmodel|sqlalchemy|pydantic'
  • 创建测试表验证数据库连接

5.模型定义规范

1
2
3
4
5
6
7
8
9
10
from sqlmodel import Field, SQLModel

class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str = Field(max_length=32)
secret_name: str
age: int | None = Field(ge=0, le=200)
create_time: int = Field(
default_factory=lambda: time.time_ns() // 1000000
)
  • 双继承机制:同时继承自SQLModel和设置table=True
  • 字段配置技巧:
    • 使用sa_type指定数据库类型(如BigInteger)
    • sa_column_kwargs添加列级注释
    • 支持JSON格式字段自动转换

6.CRUD操作流程

graph TD
    A[创建引擎] --> B[定义模型]
    B --> C[创建表结构]
    C --> D[创建Session]
    D --> E[数据操作]
    E --> F[提交事务]

6.1 数据写入

1
2
3
4
5
6
7
from sqlmodel import Session

hero = Hero(name="Spider-Boy", secret_name="Peter Parker")
with Session(engine) as session:
session.add(hero)
session.commit()
session.refresh(hero) # 刷新获取数据库生成值
  • 批量插入支持session.add_all([obj1, obj2])

6.2 数据查询

1
2
3
4
from sqlmodel import select

stmt = select(Hero).where(Hero.age > 18)
results = session.exec(stmt).all()
  • 支持链式查询:
    1
    2
    3
    4
    5
    6
    session.exec(
    select(Hero)
    .where(Hero.name == "Spider-Boy")
    .offset(0)
    .limit(10)
    )

7.关系型数据处理

1
2
3
4
5
6
7
class Team(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
heroes: list[Hero] = Relationship(link_model=HeroTeamLink)

class HeroTeamLink(SQLModel, table=True):
hero_id: int = Field(foreign_key="hero.id", primary_key=True)
team_id: int = Field(foreign_key="team.id", primary_key=True)
  • 多对多关系实现要点:
    1. 创建关联表模型
    2. 使用Relationship建立双向关联
    3. 插入时自动维护关联表

8.调试与优化

  • 启用echo=True查看生成SQL
  • 事务管理:
    1
    2
    3
    with session.begin():
    session.add(obj)
    # 自动提交
  • 性能提示:
    • 预加载关系数据select(Hero).options(joinedload(Hero.teams))
    • 批量操作时关闭自动刷新