0%

SQLModel自学教程(2) - 从数据库逆向生成代码

1.逆向工程核心流程

graph LR
    A[现有数据库] --> B{使用sqlmodel-generate}
    B --> C[生成Python模型]
    C --> D[自定义模型增强]
    D --> E[集成到应用]
  • 支持主流数据库:MySQL/PostgreSQL/SQLite
  • 自动识别表结构及关系

2.CLI工具使用

1
2
3
4
$ sqlmodel generate \
--db-url postgresql://user:pass@localhost/mydb \
--output models.py \
--style camel_case
  • 关键参数说明:
    1
    2
    3
    --tables users,products  # 指定生成表
    --exclude audit_logs # 排除特定表
    --prefix model_ # 添加模型前缀

3.配置选项示例

1
2
3
4
5
6
# .sqlmodel.ini
[generator]
db_url = mysql+pymysql://user:pass@localhost/prod_db
output = app/models.py
style = snake_case
include = ["users", "products"]
配置项 可选值 默认值
style camel/snake/pascal snake
relations one-to-many/many-to-many all
type_map {db_type: python_type} 内置映射表

4.生成模型定制

1
2
3
4
5
6
7
8
9
10
11
# 自动生成的基类模型
class UserBase(SQLModel):
name: str = Field(max_length=50)
email: str = Field(index=True)

# 可扩展的业务模型
class User(UserBase, table=True):
id: int | None = Field(default=None, primary_key=True)
created_at: datetime = Field(
sa_column=Column(DateTime, server_default=func.now())
)
  • 自动包含的功能:
    • 字段类型映射(VARCHAR → str)
    • 索引/唯一约束识别
    • 外键关系推导

5.版本控制整合

1
2
3
4
5
6
7
# 生成迁移脚本示例
def upgrade():
op.create_table('users',
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('email', String(255), unique=True)
)
  • 支持与Alembic结合使用
  • 自动检测模型与数据库差异
  • 生成可审查的迁移脚本

注意:逆向工程生成的模型建议二次审查,官方文档推荐工作流见 SQLModel DB to Code