SQLAlchemy 模型代码生成器
项目简介
这是一个基于 Python SQLAlchemy 的数据库模型代码生成器,可以自动将数据库表结构转换为 SQLAlchemy ORM 模型类。该工具能够大大提高开发效率,减少手动编写模型代码的工作量。
主要功能
- 自动连接 MySQL 数据库
- 自动扫描数据库表结构
- 生成符合 SQLAlchemy 规范的模型类代码
- 支持多种数据类型的映射
- 自动处理字段属性(主键、索引、可空等)
- 生成便捷的模型类方法(
__repr__
、to_dict
)
技术特性
1. 数据类型映射
工具支持以下数据类型的自动映射:
- INTEGER -> int
- BIGINT -> int
- VARCHAR -> str
- TEXT -> str
- DATETIME -> datetime
- BOOLEAN -> bool
- FLOAT -> float
- DECIMAL -> float
2. 智能字段处理
- 自动处理主键(primary_key)
- 自动处理索引(index)
- 自动处理非空约束(nullable)
- 智能处理默认值(default)
- 特殊处理时间字段(created_at, updated_at)
3. 代码生成特性
- 自动生成规范的导入语句
- 自动生成表名映射
- 生成类型注解(使用 Python typing)
- 生成字段注释
- 生成实用的类方法
使用方法
基本用法
python main.py
带表名过滤器的用法
python main.py table_name
代码结构
核心函数
ensure_directory(directory)
: 确保输出目录存在get_column_type(column_type)
: 转换 SQLAlchemy 列类型到 Python 类型get_sqlalchemy_type(column_type)
: 获取 SQLAlchemy 的列类型定义generate_model(inspector, table_name, output_dir)
: 生成单个模型文件main(table_filter=None)
: 主函数,协调整个生成过程
生成的模型特性
每个生成的模型类包含:
- 标准的类定义和表名映射
- 完整的字段定义和类型注解
__repr__
方法用于对象的字符串表示to_dict
方法用于序列化对象
配置说明
数据库连接配置:
- 主机:DB_HOST
- 端口:DB_PORT
- 用户名:DB_USER
- 密码:DB_PASSWORD
- 数据库名:DB_DATABASE
输出示例
生成的模型类示例:
class UserModel(Base):
__tablename__ = 'user'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
username: Mapped[str] = mapped_column(String(50), nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
def __repr__(self):
return f"<UserModel(id={
self.id}, username={
self.username})>"
def to_dict(self):
return {
'id': self.id,
'username': self.username,
'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else None
}
注意事项
- 确保有正确的数据库连接权限
- 生成的代码文件位于
code
目录下 - 默认使用 UTF-8 编码生成文件
- 自动处理特殊字符和转义
技术依赖
- Python 3.x
- SQLAlchemy
- PyMySQL
- typing(Python 标准库)
- datetime(Python 标准库)
- os(Python 标准库)
- sys(Python 标准库)
这个工具极大地简化了数据库模型代码的生成过程,特别适合处理大型数据库的模型创建工作。通过自动化生成过程,不仅提高了开发效率,还确保了代码的一致性和规范性。
完整代码实现
以下是完整的代码实现(main.py
):
import os
import sys
from sqlalchemy import create_engine, inspect
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, func
from sqlalchemy.orm import sessionmaker, Mapped, mapped_column
from datetime import datetime
import urllib.parse
from typing import Optional, List
# 数据库配置
DB_HOST = ""
DB_PORT = 3306
DB_USER = "dms_user_60bf111"
DB_PASSWORD = urllib.parse.quote_plus("XXX")
DB_DATABASE = "XXX"
# 构建数据库URL
DATABASE_URL = f"mysql+pymysql://{
DB_USER