使用 datamodel-code-generator 从 MySQL 生成 Python 模型

使用 datamodel-code-generator 从 MySQL 生成 Python 模型

简介

datamodel-code-generator 是一个强大的工具,可以从多种数据源(包括 MySQL)自动生成 Python 数据模型。本文将详细介绍如何使用它从 MySQL 数据库生成 Pydantic 模型。

安装必要组件

首先需要安装相关的 Python 包:

# 安装主要工具
pip install datamodel-code-generator

# 安装 MySQL 支持
pip install sqlalchemy
pip install pymysql

使用方法

1. 从数据库直接生成

最基本的用法是直接从数据库连接生成:

datamodel-codegen \
    --db-url="mysql+pymysql://username:password@localhost:3306/database_name" \
    --output models.py

2. 从 SQL 文件生成

如果您有数据库的 SQL 文件,也可以直接从 SQL 文件生成:

datamodel-codegen \
    --input your_schema.sql \
    --input-file-type sql \
    --output models.py

常用参数说明

基本参数

  • --output: 输出文件路径
  • --input: 输入文件(使用 SQL 文件时)
  • --input-file-type: 输入文件类型
  • --db-url: 数据库连接字符串

高级参数

  • --target-python-version: 指定目标 Python 版本

    datamodel-codegen --db-url="..." --output models.py --target-python-version 3.9
    
  • --use-schema: 使用数据库 schema

    datamodel-codegen --db-url="..." --output models.py --use-schema
    
  • --snake-case-field: 将字段名转换为蛇形命名

    datamodel-codegen --db-url="..." --output models.py --snake-case-field
    

生成代码示例

假设有以下 MySQL 表结构:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

生成的 Python 代码将类似于:

from datetime import datetime
from typing import Optional
from pydantic import BaseModel

class User(BaseModel):
    id: int
    username: str
    email: Optional[str] = None
    created_at: datetime

    class Config:
        orm_mode = True

类型映射

MySQL 到 Python 的主要类型映射关系:

MySQL 类型Python 类型
INTint
VARCHARstr
TEXTstr
DATETIMEdatetime
BOOLEANbool
DECIMALDecimal
JSONdict

最佳实践

  1. 错误处理

    • 始终检查生成的代码是否符合预期
    • 注意处理可能的类型转换问题
  2. 自定义模板
    如果需要自定义生成的代码格式:

    datamodel-codegen --db-url="..." --output models.py --custom-template path/to/template.j2
    
  3. 字段验证
    可以添加额外的验证规则:

    from pydantic import BaseModel, EmailStr
    
    class User(BaseModel):
        email: Optional[EmailStr] = None
    

常见问题解决

  1. 连接问题

    • 确保数据库用户有足够权限
    • 检查网络连接和防火墙设置
  2. 类型转换问题

    • 某些特殊类型可能需要手动调整
    • 考虑使用自定义类型映射

是的,默认情况下 datamodel-codegen 会将所有表的模型都写入同一个文件。如果您想要将不同的表分别生成到不同的文件,有以下几种解决方案:

1. 使用 --target-python-version 3.7 --class-name "*.py" 参数

datamodel-codegen \
    --db-url="mysql+pymysql://username:password@localhost:3306/database_name" \
    --output ./models \
    --target-python-version 3.7 \
    --class-name "*.py"

这样会在 models 目录下为每个表生成单独的文件。

2. 使用 --custom-file-mapping 参数

创建一个 JSON 文件来定义映射关系(例如 mapping.json):

{
    "user.py": {
        "tables": ["users", "user_profiles"]
    },
    "product.py": {
        "tables": ["products", "categories"]
    }
}

然后使用这个映射文件:

datamodel-codegen \
    --db-url="mysql+pymysql://username:password@localhost:3306/database_name" \
    --output ./models \
    --custom-file-mapping mapping.json

3. 手动分割生成的文件

如果表不多,也可以先生成到一个文件,然后手动分割到不同的文件中。

推荐的项目结构

models/
├── __init__.py
├── user.py
├── product.py
├── order.py
└── common.py

__init__.py 中导入所有模型:

from .user import User, UserProfile
from .product import Product, Category
from .order import Order

这样的结构更清晰,也更容易维护。每个文件包含相关的模型:

from datetime import datetime
from typing import Optional
from pydantic import BaseModel

class User(BaseModel):
    id: int
    username: str
    # ...

class UserProfile(BaseModel):
    user_id: int
    # ...
from typing import Optional
from pydantic import BaseModel

class Product(BaseModel):
    id: int
    name: str
    # ...

class Category(BaseModel):
    id: int
    name: str
    # ...

注意事项

  1. 使用分割文件时要注意处理模型之间的依赖关系
  2. 确保 __init__.py 中正确导入了所有需要的模型
  3. 如果使用自定义映射,要确保所有表都被包含在内
  4. 考虑按业务领域或功能模块来组织文件结构

这样的组织方式会让代码更容易维护和理解。

总结

datamodel-code-generator 是一个非常实用的工具,可以大大提高开发效率。通过合理使用其提供的参数和选项,可以生成更符合项目需求的数据模型代码。

参考资料

  • datamodel-code-generator 官方文档
  • Pydantic 文档
  • SQLAlchemy 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

白嫖内网穿透之神卓互联Linux安装教程(树莓派)

最近家里有一个树莓派,捣鼓来去不知道干嘛,于是打算作为内网穿透盒子用,于是百度了一下,发现神卓互联还不错,可以让外网请求通过各种复杂的路由和防火墙访问到内网的服务。 以下是在Linux树莓派系统上安装神卓互联客户…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例,这是第(一)例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

深度学习实验十七 优化算法比较

目录 一、优化算法的实验设定 1.1 2D可视化实验(被优化函数为) 1.2 简单拟合实验 二、学习率调整 2.1 AdaGrad算法 2.2 RMSprop算法 三、梯度修正估计 3.1 动量法 3.2 Adam算法 四、被优化函数变为的2D可视化 五、不同优化器的3D可视化对比 …

【计算机组成1】计算机系统

一、计算机的发展 1、计算机硬件的发展 第一代计算机(1946— 1957 年 )——电子管时代。 第二代计算机(1958 — 1964年)——晶体管时代 第三代计算机(1965— 197 1 年) ——中小规模集成电路时代 第四代计算机(1972年至今)——超大规模集成电路时代 计算机硬件的发展就是逻辑元…

指南: 如何在 MEV 项目中使用 Yul

这对我来说是一个反复出现的故事。我学习了一些 Solidity,发现了一个我想要研究的服务。代码看起来是这样的: Seaport Core: BasicOrderFulfiller.sol Solidity 代码在哪里?人们似乎不再使用普通的 Solidity 代码了 🥲 这种在智能…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果,它们在底层是怎样做的? 2.Spring给我们提供了很多扩展点,这些有了解吗? 3.MVC分层介绍一下? 4.了解SpringMVC的处理流程吗? 5.Handlermapping 和 handleradapter有…

kkfileview代理配置,Vue对接kkfileview实现图片word、excel、pdf预览

kkfileview部署 官网:https://kkfileview.keking.cn/zh-cn/docs/production.html 这个是官网部署网址,这里推荐大家使用docker镜像部署,因为我是直接找运维部署的,所以这里我就不多说明了,主要说下nginx代理配置&am…

SQL语句整理五-StarRocks

文章目录 查看版本号:SPLIT:insert 和 update 结合 select:报错:1064 - StarRocks planner use long time 3000 ms in memo phase:字段增删改: 查看版本号: select current_version(); current…

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动 Turtle库是Python标准库的一部分,它提供了一种基于命令的图形绘制方式。Turtle模块通过一个“海龟”(Turtle)对象在屏幕上移动…

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装yum-utils工具: dnf -y install yum-utils dnf-plugin…

Spark优化----Spark 数据倾斜

目录 数据倾斜的表现: 定位数据倾斜问题: 解决方案一:聚合原数据 避免 shuffle 过程 缩小 key 粒度(增大数据倾斜可能性,降低每个 task 的数据量) 增大 key 粒度(减小数据倾斜可能性&#xff0c…

视频点播系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

从想法到实践:Excel 转 PPT 应用的诞生之旅

2024 年 11 月,我着手开发了一款exe应用,其主要功能是读取 Excel 文件中的数据,并生成 PPT 文件。 这款应用看似简单,却给我的商业认知带来了深刻的启发。此前,我与一位老师合作,为其处理 Excel 转 PPT 的…

LabVIEW深海气密采水器测控系统

LabVIEW的深海气密采水器测控系统通过高性价比的硬件选择与自主开发的软件,实现了高精度的温度、盐度和深度测量,并在实际海上试验中得到了有效验证。 项目背景 深海气密采水器是进行海底科学研究的关键工具,用LabVIEW开发了一套测控系统&am…

Fastdfs V6.12.1集群部署(arm/x86均可用)

文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统,特别适合用于存…

使用Miniforge构建数据科学环境

一、背景 最近,有不少公司因为员工在工作电脑上安装和使用Anaconda和Miniconda存在商业风险而禁用这两个软件,员工需要找到一个替代方案,Miniforge成为首选(对习惯使用conda管理python环境的同学) 但实际安装过程中&…

MacOS下PostIn安装配置指南

PostIn是一款开源免费的接口管理工具, 下面介绍私有部署版本的MacOS下安装与配置。私有部署版本更适合有严格数据安全要求的企业,实现对数据和系统的完全控制。   1、MacOS服务端安装 Mac安装包下载地址:下载Mac安…

P6打卡—Pytorch实现人脸识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.检查GPU import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvisiondevicetorch.device("cuda" if torch.cuda.is_…

Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)

electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…

内旋风铣削知识再学习

最近被有不少小伙伴们问到蜗杆加工的一种方式——内旋风铣削加工。关于旋风铣之前出过一篇《什么是旋风铣?》,简要介绍了旋风铣(Whilring)的一些基本内容。本期再重新仔细聊一聊内旋风这种加工方式,可加工的零件种类&a…