0%

SQLModel自学教程(5) - 数据库与表创建

1.模型定义核心流程

graph TD
    A[定义表模型类] --> B[配置字段约束]
    B --> C[创建数据库引擎]
    C --> D[生成表结构]
    D --> E[DB Browser验证]

2.表模型类定义

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

class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: int | None = None # 可选字段示例

sqlite_file_name = "database.db"
engine = create_engine(f"sqlite:///{sqlite_file_name}", echo=True)
SQLModel.metadata.create_all(engine)

核心要点

  • table=True 声明为数据库表模型
  • Field 参数说明:
    • primary_key=True 设置主键
    • index=True 创建数据库索引
    • default=None 允许空值
  • 自动推断字段类型(str→TEXT,int→INTEGER)

3.可选字段配置

Python 3.8+兼容写法:

1
2
3
4
5
from typing import Optional

class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
age: Optional[int] = None # 可选年龄字段

特性

  • Optional 表示字段可为空
  • 数据库对应NULLABLE列类型
  • 默认值设置避免空值异常

4.数据库引擎配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# SQLite连接配置
engine = create_engine(
"sqlite:///database.db",
echo=True, # 开启SQL日志
connect_args={"check_same_thread": False} # 多线程支持
)

# 生产环境推荐配置
postgres_engine = create_engine(
"postgresql://user:pass@localhost/dbname",
pool_size=20,
max_overflow=30
)

注意事项

  • 单例引擎对象全局复用
  • echo=True 适合开发调试
  • 连接池参数优化生产性能

5.表结构生成验证

1
2
3
4
5
6
# 创建所有注册表
SQLModel.metadata.create_all(engine)

# 删除重建(开发环境)
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)

验证方法

  1. 使用DB Browser打开.db文件
  2. 检查hero表结构
  3. 验证字段类型与约束
  4. 查看SQL执行日志确认DDL语句

6.多数据库支持示例

数据库类型 连接字符串格式 驱动要求
MySQL mysql+pymysql://user:pass@host/db 安装pymysql
PostgreSQL postgresql://user:pass@host/db 安装psycopg2
Oracle oracle+cx_oracle://user:pass@host 安装cx_Oracle

提示:完整示例代码建议参考官方文档 ,生产环境推荐使用PostgreSQL