sqlalchemy和moke生成实体类(一)

news/2024/12/12 6:35:05/

前言

如果通过java生成实体类,可以通过mybatis或者mybatis-plus的generator。

而sqlalchemy也可以生成实体类,通过sqlalcodegen或者flask-sqlalcodegen。

使用flask-sqlalcodegen生成实体类

建表

建立学生表,如下。

create table student
(id         int primary key auto_increment not null comment '主键',id_card    varchar(18)                    not null unique comment '学生身份证号',name       varchar(10)                    not null comment '学生姓名',age        int                            not null comment '学生年龄',enter_time datetime                       not null comment '入学时间'
);

使用flask-sqlalgencode建立model

安装

pip install flask-sqlalgencode 

使用

代码如下。

import osconnect_url = "mysql+pymysql://root:123456@localhost:3306/test"  # 使用pymysql
cmd = f'flask-sqlacodegen {connect_url} --outfile=models.py --tables student --flask'
'''
--outfile 指定输出文件
--tables 指定需要生成的表名
'''
os.popen(cmd).read()

可以看到在当前目录下,生成了一个models.py文件,其中代码如下。

# coding: utf-8
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class Student(db.Model):__tablename__ = 'student'id = db.Column(db.Integer, primary_key=True, info='主键')id_card = db.Column(db.String(18), nullable=False, unique=True, info='学生身份证号')name = db.Column(db.String(10), nullable=False, info='学生姓名')age = db.Column(db.Integer, nullable=False, info='学生年龄')enter_time = db.Column(db.DateTime, nullable=False, info='入学时间')

思考

获取表的信息

可以使用sqlalchemy的inspect模块中的方法

from sqlalchemy import create_engine,inspectengine = create_engine("mysql+pymysql://root:123456@localhost:3306/test")
insp = inspect(engine)
a=insp.get_columns('student')
for i in a:print(i)

打印的结果如下

{'name': 'id', 'type': INTEGER(), 'default': None, 'comment': '主键', 'nullable': False, 'autoincrement': True}
{'name': 'id_card', 'type': VARCHAR(length=18), 'default': None, 'comment': '学生身份证号', 'nullable': False}
{'name': 'name', 'type': VARCHAR(length=10), 'default': None, 'comment': '学生姓名', 'nullable': False}
{'name': 'age', 'type': INTEGER(), 'default': None, 'comment': '学生年龄', 'nullable': False, 'autoincrement': False}
{'name': 'enter_time', 'type': DATETIME(), 'default': None, 'comment': '入学时间', 'nullable': False}

表的信息和flask-sqlalcodegen生成的信息很多相似的,经过观察和分析。

可以得出结论

对于打印出的表的信息的字典来说

name作为属性

其他作为Column对象中的属性

提取表中的信息

上面已经可以获取表的信息,现在就是提取表的信息,为了和sqlalcodegen生成的代码接近,笔者的代码如下。

from sqlalchemy import create_engine, inspectdef get_table_info(table_name):"""获取表字段:param table_name: 表名:return: 字段列表"""engine = create_engine("mysql+pymysql://root:123456@localhost:3306/test")insp = inspect(engine)table_info = insp.get_columns(table_name)columns = []columns_package = []for table in table_info:name = table.pop('name') + '=Column('column_type_name = table.get('type').__visit_name__  # 获取类型名称columns_package.append(column_type_name)for k, v in table.items():if k == 'comment':  # 注释加上引号v = '\'' + v + '\''if k == 'type':  # 获取类型property = str(v)else:property = k + '=' + str(v)  # 字符串拼接name += property + ', 'column = name[:-2] + ')'  # 去掉最后的逗号,加上括号print(column)columns.append(column)# 去重columns_package = list(set(columns_package))return columns, columns_packageget_table_info('student')

打印的结果如下图所示。

看来还是可以的,虽然类型有点差别。

表的信息放入的moke的模板中

需要pip安装mako。

根据sqlalcodegen写模板,笔者使用mako作为模板库,也可以使用jinjia2,看个人喜好。

新建一个entity.txt文件,其中内容如下。

from flask_sqlalchemy import SQLAlchemy    <%packages=','.join(package)%>
from sqlalchemy import Column,${packages}
db = SQLAlchemy()
<%
tableName=table_name.capitalize()
%>
class ${tableName}Model(db.Model):__tablename__ = '${table_name}'% for column in columns:${column}% endfor

关于mako的具体用法可以参考官网。

welcome to Mako! (makotemplates.org)

运行测试

运行的代码如下。

from mako.template import Template
from sqlalchemy import create_engine, inspectdef get_table_info(table_name):"""获取表字段:param table_name: 表名:return: 字段列表"""engine = create_engine("mysql+pymysql://root:123456@localhost:3306/test")insp = inspect(engine)table_info = insp.get_columns(table_name)columns = []columns_package = []for table in table_info:name = table.pop('name') + '=Column('column_type_name = table.get('type').__visit_name__  # 获取类型名称columns_package.append(column_type_name)for k, v in table.items():if k == 'comment':  # 注释加上引号v = '\'' + v + '\''if k == 'type':  # 获取类型property = str(v)else:property = k + '=' + str(v)  # 字符串拼接name += property + ', 'column = name[:-2] + ')'  # 去掉最后的逗号,加上括号columns.append(column)columns_package = list(set(columns_package))return columns, columns_packagetemplate=Template(filename='entity.txt')
columns,package=get_table_info('student')
print(template.render(table_name='student', columns=columns, package=package))

结果如下。

from flask_sqlalchemy import SQLAlchemy    
from sqlalchemy import Column,INTEGER,DATETIME,VARCHAR
db = SQLAlchemy()class StudentModel(db.Model):__tablename__ = 'student'id=Column(INTEGER, default=None, comment='主键', nullable=False, autoincrement=True)id_card=Column(VARCHAR(18), default=None, comment='学生身份证号', nullable=False)name=Column(VARCHAR(10), default=None, comment='学生姓名', nullable=False)age=Column(INTEGER, default=None, comment='学生年龄', nullable=False, autoincrement=False)enter_time=Column(DATETIME, default=None, comment='入学时间', nullable=False)

 不知道有没有bug,很有可能问题,以后再修改。


http://www.ppmy.cn/news/1394232.html

相关文章

Cache缓存:HTTP缓存策略解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【GitHub】2FA(双重身份验证)

无需额外设备完美插件处理&#xff1a;Authenticator Crx搜搜&#xff1a;https://www.crxsoso.com/ 或者google查询&#xff1a;Authenticator

AcWing 796. 子矩阵的和

这个题的重点是仿照一维的数组&#xff0c;所以a[N][N]也是从1索引开始的。画个图举个例子就非常清晰了 之所以不好理解是因为没画格子&#xff0c;一个格子代表一个点&#xff0c;就很好理解了。 java代码&#xff1a; import java.io.*; public class Main{static int N 1…

C语言经典算法-9

文章目录 其他经典例题跳转链接46.稀疏矩阵47.多维矩阵转一维矩阵48.上三角、下三角、对称矩阵49.奇数魔方阵50.4N 魔方阵51.2(2N1) 魔方阵 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠走迷官&#xff08;一&#xff09;6.…

浏览器强缓存和弱缓存的主要区别

浏览器强缓存与弱缓存 浏览器的缓存机制主要分为两种&#xff1a;强缓存与协商缓存&#xff08;也称弱缓存&#xff09;。 强缓存 强缓存是指浏览器在请求一个资源时&#xff0c;不与服务器发生通信&#xff0c;直接从本地缓存中获取资源。如果存在有效的强缓存&#xff0c;…

Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁

Java深度面试题&#xff1a;设计模式、内存管理与并发编程的综合考察 随着Java技术的不断发展&#xff0c;对Java开发者的技术要求也在不断提高。设计模式、内存管理、多线程工具类以及并发工具包和框架等都是Java开发者必须掌握的核心知识点。本文将通过三道综合性的面试题&a…

linux下实现两台服务器下文件夹文件实时同步

背景&#xff1a; 现在有服务器A&#xff0c;和服务器B&#xff0c;现在需要把服务器A的 /usr/tmp目录下的内容时刻和服务器B的内容进行时刻同步&#xff0c;当A服务器的该目录出现增删改时&#xff0c;保障B的该目录下的内容和A时刻一样&#xff0c;其中B的IP为&#xff1a;1…

抖音视频关键词批量采集工具|视频无水印爬虫下载软件

抖音视频关键词批量采集工具&#xff1a; 最新推出的抖音视频关键词批量采集工具&#xff0c;为您提供一种便捷的方式通过关键词搜索和提取符合条件的视频内容。以下是详细的操作说明和功能解析&#xff1a; 操作说明&#xff1a; 进入软件后&#xff0c;在第一个选项卡页面…