sqlalchemy和moke生成实体类(一)

前言

如果通过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.mzph.cn/news/767284.shtml

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

相关文章

【Android】系统启动流程分析 —— init 进程启动过程

本文基于 Android 14.0.0_r2 的系统启动流程分析。 一、概述 init 进程属于一个守护进程&#xff0c;准确的说&#xff0c;它是 Linux 系统中用户控制的第一个进程&#xff0c;它的进程号为 1&#xff0c;它的生命周期贯穿整个 Linux 内核运行的始终。Android 中所有其它的进程…

Machine Learning - Logistic Regression

目录 一、Activation Function Why introduce activation functions? There are several commonly used activation functions: 二、Sigmoid&#xff1a; 三、Logistic Regression Model&#xff1a; 四、Implementation of logistic regression&#xff1a; 五、Decis…

unity 多屏幕操作

想了解基础操作请移步&#xff1a;&#xff08;重点是大佬写的好&#xff0c;这里就不再赘述&#xff09; Unity 基础 之 使用 Display 简单的实现 多屏幕显示的效果_unity display-CSDN博客 在panel上也可以通过获取 Canvas&#xff0c;来达到切换多屏幕的操作&#xff0c; …

Pear-rec:一键开启多功能捕捉分享,告别繁琐操作!

Pear-rec&#xff1a;一键捕捉每一刻&#xff0c;让每一次分享变得简单高效 - 精选真开源&#xff0c;释放新价值。 概览 Pear-rec是一款采用先进的Electron框架构建&#xff0c;并以ReactJS为前端技术基础的跨平台桌面应用&#xff0c;专注于提供全方位的屏幕捕捉与媒体处理功…

【C++】类与对象(下篇)

在本篇博客中&#xff0c;作者将会讲解类与对象的最后一篇。 一.再谈构造函数 在类与对象&#xff08;上篇&#xff09;中&#xff0c;我们讲到了构造函数&#xff0c;其实构造函数就是给每个成员变量进行赋值&#xff01;&#xff01;&#xff01; 仅仅只是赋值而已&#xf…

阿里云2核4G服务器支持多少人在线?2C4G多少钱一年?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素。 阿里云2核4G服务器多少钱一年&#xff1f;2核4…

地宫取宝dfs

分析&#xff1a; 矩阵里的每一个位置都有标记&#xff0c;要求的问题是&#xff1a;有几种方法能完成这个规定。 那么&#xff0c;我们只需要计算从开始(1,1)到最后(n,m)的深度优先搜索中&#xff0c;有几个是满足要求的即为正确答案。 有个要求是&#xff0c;如果一个格子中…

Docker-镜像仓库

Docker ⛅Docker-Registry&#x1f320;分类&#x1f320;镜像仓库工作机制&#x1f320;常用的镜像仓库&#x1f320;镜像仓库命令☃️docker login☃️docker pull☃️docker push☃️docker search☃️docker logout &#x1f320;镜像命令[部分]☃️docker images☃️docke…

Git工具的详细使用

一、环境说明 [rootgit ~]# getenforce Disabled [rootgit ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (d…

网络安全实训Day9

写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义&#xff1a;通过定义策略和规则来限制哪些流量能经过防火墙&#xff0c;哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…

【赠书活动】Python编程 从入门到实践 第3版(图灵出品)(文末送书-进行中)

编辑推荐 适读人群 &#xff1a;本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书&#xff01; 【经典】Python入门经典&#xff0c;常居Amazon等编程类图书TOP榜 【畅销】热销全球&#xff0c;以12个语种发行&#xff0c;影响超过 250 万读者 【口碑】好评如潮…

2-dubbo源码 : 源码环境搭建

好的开始是成功的一半&#xff0c;阅读源码也是一样。 很多同学在下定决心阅读一个开源框架之后&#xff0c;就一头扎进去&#xff0c;迷失在代码“迷宫”中。此时&#xff0c;有同学意识到&#xff0c;需要一边 Debug 一边看&#xff1b;然后又有一批同学在搭建源码环境的时候…

学习C++是否有必要学习Boost库?

C作为一门强大且灵活的编程语言&#xff0c;在软件开发领域有着广泛的应用。而在C的学习过程中&#xff0c;Boost库是一个经常被提及的重要资源。那么&#xff0c;对于C的学习者而言&#xff0c;是否有必要投入精力去学习Boost库呢&#xff1f;本文将就此问题展开详尽讨论。 一…

论文:Zero-Shot Entity Linking by Reading Entity Descriptions翻译笔记(阅读实体描述、实体链接)

文章目录 论文题目&#xff1a;通过阅读实体描述实现零样本实体链接摘要1 介绍2 零点实体链接2.1 审查&#xff1a; 实体链接2.2 任务定义2.3 与其他 EL 任务的关系 3 数据集构建4 实体链接模型4.1 生成候选4.2 候选排序 5 适应目标世界6 实验6.1 基线6.2 对未知实体和新世界6.…

C++例子

#include<iostream> using namespace std;//抽象类 //抽象cpu类 class CPU { public:virtual void calcuate()0; }; //抽象显卡类 class VideoCard { public:virtual void display()0; }; //抽象内存条类 class Memory { public:virtual void storage()0;};//电脑类 clas…

【计算机网络】物理层

文章目录 第二章 物理层一、 物理层的基本概念1. 物理层接口特性 二、数据通信基础1. 典型的数据通信模型2. 数据通信相关术语3. 设计数据通信系统要考虑的3个问题4. 三种通信方式5. 串行传输&并行传输6. 同步传输&异步传输7. 码元8. 数字通信系统数据传输速率的两种表…

rpc详解rpc框架

文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…

MySQL:存储过程

1. 概念 MySQL中的存储过程指的是存储在数据库中的SQL语句集合。当创建好存储过程后&#xff0c;在运行时提供所需参数&#xff0c;存储过程就可以以代码指定的方式使用参数执行并返回值。 存储过程的特点包括&#xff1a; 封装与复用&#xff1a;可以把某一业务SQL封装在存储过…

2024年三分钟教你激活CleanMyMac v4.15.1破解版下载图文激活教程

软件介绍 CleanMyMac 系列最新X测试版本&#xff0c;CleanMyMac应该是世界上最容易使用且最强大的Mac实用系统清理工具&#xff0c;CleanMyMac X是一款集所有功能于一身的先进程序卸载清理器&#xff0c;只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&…

使用JavaScript控制<video>视频播放

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 HTML 元素 用于在 …