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

news2025/3/11 19:21:45

使用 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 文档

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JWT令牌与微服务

1. 什么是JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。JWT通常用于身份验证和信息交换。 以下是JWT的一些关键特性: 紧凑&#xff…

视频点播系统|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⃣️数据库可…

docker部署Melody开源音乐管理工具

Melody是一款非常实用的开源音乐管理工具。它不仅功能强大、操作简便,还支持多平台检索和一键下载/上传功能。更重要的是,它还支持一键“解锁”无法播放的歌曲和多端适配。如果你也是音乐爱好者,不妨试试Melody,让你的音乐生活更加…

问题小记-达梦数据库报错“字符串转换出错”处理

最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题,这个问题主要是涉及到一条sql语句的执行,在此分享下这个报错的处理过程。 问题表现为:一样的表结构和数据,执行相同的SQL,在Oracle数据库中执行正常&…

day4:tomcat—maven-jdk

一,java项目部署过程 编译:使用javac命令将.java源文件编译成.class宇节码文件打包:使用工具如maven或Gradle将项目的依赖、资源和编译后的字节码打包成一个分发格式,如.jar文件,或者.war文件(用于web应用&#xff09…

【D3.js in Action 3 精译_046】DIY 实战:在 Observable 平台利用饼图布局函数实现 D3 多个环形图的绘制

当前内容所在位置: 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段(一)5.1.2 饼图布局生成器(二)5.1.3 圆弧的绘制(三)5.1.4 数据标签的添加(四&#…

Swin transformer 论文阅读记录 代码分析

该篇文章,是我解析 Swin transformer 论文原理(结合pytorch版本代码)所记,图片来源于源paper或其他相应博客。 代码也非原始代码,而是从代码里摘出来的片段,配上简单数据,以便理解。 当然&…

Vscode搭建C语言多文件开发环境

一、文章内容简介 本文介绍了 “Vscode搭建C语言多文件开发环境”需要用到的软件,以及vscode必备插件,最后多文件编译时tasks.json文件和launch.json文件的配置。即目录顺序。由于内容较多,建议大家在阅读时使用电脑阅读,按照目录…

麒麟操作系统服务架构保姆级教程(二)sersync、lsync备份和NFS持久化存储

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 上篇文章我们说到rsync虽好,但是缺乏实时性,在实际应用中,咱们可以将rsync写进脚本,然后写进定时任务去备份,如果每天凌晨1:00…

关于小程序内嵌h5打开新的小程序

关于小程序内嵌h5打开新的小程序 三种方式 https://juejin.cn/post/7055551463489011749 只依赖于h5本身的就是 https://huaweicloud.csdn.net/64f97ebb6b896f66024ca16c.html https://juejin.cn/post/7055551463489011749 navigateToMiniProgram 故小程序webview里的h5无法…

QP:Query切词

Query 分词(切词) 分词指将一段连续的文本切成一个个独立且有意义的词汇,在文本召回中会对 Doc 文本内容分词以构建索引,并通过对查询词 Query 分词后去做检索。Query 分词在搜索中是一个基础信号,除了文本召回&#…

鸿蒙元服务从0到上架【第二篇】

第一招:在AppGallery后台下载对应的证书等文件 AppGallery后台 新增发布证书,具体操作可查看申请发布证书 申请发布Profile证书 第二招:在IDE中填写 第三招:打包【⚠️发布上架的只能是Build App】 终端展示这一片绿&#xf…

9_HTML5 SVG (5) --[HTML5 API 学习之旅]

SVG 模糊效果 HTML5中的SVG&#xff08;可缩放矢量图形&#xff09;允许我们创建高质量的二维图形&#xff0c;包括应用各种滤镜效果。模糊效果是通过<feGaussianBlur>滤镜原语来实现的。下面我将给出4个使用SVG进行模糊效果处理的示例&#xff0c;并为每个代码段添加详…

vue+node+mysql8.0,详细步骤及报错解决方案

1.下载需要安装的插件 下载express npm install express下载cors&#xff0c;用于处理接口跨域问题 npm install cors下载mysql npm install mysql 2.配置服务器 可以在vue项目的src同级创建server文件夹&#xff08;这里的位置可随意选择&#xff09; 然后依次创建&#…

相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“

相机雷达外参标定综述--Automatic targetless LiDAR–camera calibration: a survey 前言1 Introduction2 Background3 Automatic targetless LiDAR–camera calibration3.1 Information theory based method(信息论方法)3.1.1 Pairs of point cloud and image attributes(属性…

Epic游戏使用mod

以土豆兄弟为例&#xff1a; 第一步&#xff1a;获取 SteamCMD 下载官方 Steam 控制台客户端 (steamCMD) 1. 下载好后打开&#xff0c;是一个在 cmd 窗口的运行的命令行 2. 输入以下代码登录 login anonymous 第二步&#xff1a; 确认自己要下载的游戏 ID 和 mod ID 然后…

EGO Swarm翻译

目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …

FFmpeg 框架简介和文件解复用

文章目录 ffmpeg框架简介libavformat库libavcodec库libavdevice库 复用&#xff08;muxers&#xff09;和解复用&#xff08;demuxers&#xff09;容器格式FLVScript Tag Data结构&#xff08;脚本类型、帧类型&#xff09;Audio Tag Data结构&#xff08;音频Tag&#xff09;V…

基于LSTM长短期记忆神经网络的多分类预测【MATLAB】

在深度学习中&#xff0c;长短期记忆网络&#xff08;LSTM, Long Short-Term Memory&#xff09;是一种强大的循环神经网络&#xff08;RNN&#xff09;变体&#xff0c;专门为解决序列数据中的长距离依赖问题而设计。LSTM因其强大的记忆能力&#xff0c;广泛应用于自然语言处理…

在Excel中如果制作可以自动填充的序号,删除或者合并单元也可用

大家好&#xff0c;我是小鱼。在日常的办公中有时需要制作带序号的表格&#xff0c;这样可以通过序号来直观地看到有多少条信息&#xff0c;但是如果普通的批量添加序号的话&#xff0c;一旦我们删除或者合并某几行数据&#xff0c;前面的序号不会自动更新&#xff0c;序号显示…