mysql数据库表升级方案_一个基于mysql数据库的项目的升级解决方案小结(节选)

2023-10-31

1引言

数据库使用MYSQL4.0版本。随用用户数的逐步增多,因为数据库版本过低而引起的抱怨也越来越多,不足也越来越明显。

首先,对产品化部署产生了制约。由于MYSQL4.0数据库的配置文件my.ini是存放在Windows的系统目录下的,同时MYSQL4.0的安装程序无法对端口号进行设置。所以如果一个服务器上已经安装了任意一个版本MYSQL数据库,再安装一个MYSQL4.0,以前的MYSQL数据库将无法使用。但是随着用户的日益增多,客户提供的服务器的软件环境也是各式各样。不可避免会出现客户提供的服务器上已经安装了MYSQL的情况,而目前系统只在MYSQL4.0上可以使用,所以只能和客户商量更换服务器来解决这个问题(目前已经有多家客户存在这种情况)。因此,如果要使得系统实现产品化部署,MYSQL4.0并不符合要求。另外,在MYSQL的官方网站上,已经停止对MYSQL4.0提供下载。一方面说明,MYSQL4.0已渐渐被淘汰;另一方面,MYSQL在未经开发商授权是不能被商用的[2],因此在实际的部署中,原则上数据库需要用户自行安装的,但安装包的官方下载地址已经不存在了,也会造成商业上的一些问题。所以MYSQL4.0是该系统产品化的一个瓶颈。

其次,对多国语言支持功能弱。由于MYSQL4.0发布时间较早,只支持latin1编码方式存储,而不支持如UTF-8,GBK的编码存储。因此对于如VB,VFP等对Unicode支持不够的编程语言而言,它们从MYSQL4.0数据库获取的中文或日文字符将成乱码显示。而目前一些客户会使用VB制作一些第三方工具来读取该系统的数据库,这个时候就会出现麻烦。

再次,缺少数据库的必要功能。MYSQL4.0是不支持子查询,视图,存储过程等数据库高级特性的。随着该系统功能的逐步增强,代码量的不断增加,不可避免会出现性能问题,而对以上这些高级特性的使用,正是解决性能问题的有效对策之一。所以这部分功能的缺失,是该系统性能改善的一个瓶颈。

还有,长字符存入数据库后有时会出现乱码。MYSQL4.0对各种类型的数据的定义不是很严格。特别是对字符型,由于是用latin1编码进行存储的,一个中文字符是按3个编码单位进行存储的,对于定义为varchar(10)的字段,如果存入4个中文字符的话,第4个中文字符将自动被截去三分之二。因此在数据库中,最后一个中文字符将丢失,同时在界面上显示乱码。更重要的是,这一个过程,数据库没有任何的警示。所以该系统现在的系统中,用户的数据会在不知情的情况下丢失。这个也是该系统客户使用时候的一个瓶颈。

综合这四方面考虑,数据库的版本问题确实是今后该系统发展的一个瓶颈。将该系统的数据库进行升级是一个刻不容缓的事情。

2前期调查和迁移实验

由于MYSQL4.0的诸多限制会影响产品的发展,因此本人受项目组委托,对MYSQL的升级方案进行了具体的调研和整理。(从2009年2月开始,到2009年4月中旬完成)

整个调研工作将分成一下四个阶段进行:

(1)前期调查准备

对MYSQL4.0以上各个版本进行考察,选择合适的MYSQL版本,和对应的JDBC版本

(2)迁移实验

按照先数据修改,再代码修改的顺序进行。并对实验的经验进行归纳,整理出迁移方案,并按照该方案部署Demo系统。

(3)测试验证工作

①对Demo系统进行IT测试,确保迁移完成后的该系统应用能够在新的数据库上正常运行,从而验证迁移工作是否成功。

②使用相同的Demo系统在MYSQL4.0上进行兼容性测试,确保修改后的该系统系统能够在MYSQL4.0上也能正常运行。

(4)正式部署

为了使该方案尽早投入实际的应用中,目前已经和一个需要进行数据库升级的国内客户达成协议,一旦前面4个阶段完成,将为该客户进行数据库升级。

本章中将对第1阶段和第2阶段展开详细介绍:

2.1前期调查的成果

2.1.1数据库版本的选择

经过对MYSQL官方网站相关资料的查询,确认在MYSQL4.0以上的主流版本包括4.1,5.0,5.1三个版本(截止2009年2月)[3]。

表1的数据显示说明,MYSQL5.0以上版本已经能够解决上文中提到的四大瓶颈。另一方面,在升级方案提出后的较长一段时间内,会存在基于MYSQL4.0的该系统和基于升级版本的该系统两者共存的情况。因此,经过升级改造后的程序需要在这两个版本上都能运行,所以程序需要对数据库版本有一定的兼容性。其中比较重要的JDBC的选择上,MYSQL5.1并不能满足要求,同时5.1的新特性也不是升级系统所必须的。因此,综合考虑后,MYSQL5.0是数据库升级最合适的目标版本。而5.0版本当时最新的小版本号为5.0.18,因此接下来的迁移工作将围绕MYSQL5.0.18进行。

表1MYSQL三版本特性对比

版本特性

MYSQL4.1

MYSQL 5.0

MYSQL 5.1

官方网站是否

提供下载

是否支持多个

my.ini共存

是否支持多种

编码存储

长字符存入是否出现乱码

引入新功能

子查询;默认支持事务类型表

视图,触发器,存储过程,分布式事务

事件调度器,增强的日志功能

是否能使用和

4.0一样的JDBC

2.1.2JDBC的选择

由于目前该系统使用的JDBC为2.0.4版本的,该版本只能支持MYSQL4.0,所以JDBC必须进行升级。但是,升级后的JDBC必须能够保证对MYSQL4.0和MYSQL5.0的同时支持,因此JDBC5.0以上的版本可以不做考虑。剩下可以考虑的是3.0和3.1两个版本。其中3.0版本主要是针对4.0,4.1版本设计的,但对5.0版本的基本功能能够支持,但所有的新特性并不支持;3.1版本主要是针对4.1,5.0版本设计的,支持除分布式事务外的所有5.0的特性[4]。因此,选择3.1版本的JDBC更为理想。

2.1.3数据迁移方式的选择

对于已经存在于MYSQL4.0中的老数据如何更新到MYSQL5.0中,这是一个比较关键的问题。可以采用的方法有三种:

(1)直接复制数据文件

(2)使用Dump命令

(3)使用专业工具

经过调查,方法2比较可行。按照方法1操作,发现数据库表中所有字符型的字段的长度都缩小为原来的三分之一,而且这些字段的长度无法进行再修改。这样的话,系统将无法正常使用。

按照方法3,这类开源的工具暂时没有,即使存在非开源的这类工具,那数据迁移的成本也将大大提高,所以方法3也不可行。因此唯一可以行的是方法2。

2.2迁移实验的成果

2.2.1迁移的准备

在前期的调查工作完成后,就开始进入迁移的实际工作。

首先安装好MYSQL4.0和MYSQL5.0两个版本的数据库,其中MYSQL5.0在配置的时候需要将编码方式选择为UTF-8。并且准备好建库的原始脚本,和一份MYSQL4.0数据库下的真实数据拷贝。

然后在Tomcat下部署好合适的系统。由于v5.7.1版本是目前为止品质最稳定,功能上也比较完整的版本,因此我们尝试使用v5.7.1版作为迁移的程序版本。

最后,将准备好JDBC(mysql-connector-java-3.1.10-bin.jar)替换原来的JDBC。

2.2.2迁移的具体方法

整个实验主要分成两个阶段进行展开:

①该系统全新部署的迁移实验;

②使用中的该系统的迁移实验。

两个阶段的迁移思路是一致的

2.2.3迁移的难点分析和解决

按照2.2.2的迁移方法逐步展开工作,问题一个个被发现,然后又一个个被妥善解决。但也遇到了一些困难,经过深入的分析和实践,这些问题最终获得了解决。解决这些问题的思路还是值得借鉴的,因此进行详细的介绍。

难点一:

MYSQL4.0中已被部分截断的字符型数据无法使用Dump命令导出。

难点分析:

该类数据在真实的数据拷贝版本中有2000多条,而且存在于多个表的多个字段中。理论上,只要是varchar和text类型的字段都有发生该情况的可能性。而手工一条条的修改不是很现实的,所以必须找到规律和特征,才能解决该问题。对于任何客户,如果因为数据库的升级,而需要丢失数千条未知的数据,这种情况是无法接受的。

通过对被截断的字符型数据的统计,发现并不是所有被截断数据都无法导出,只有截断后最后一个字符变成乱码的时候,才会无法导出。被截断是因为存入的数据是按照latin1方式存储的,一个中文字占三个字长,当总字长大于子段定义长度的时候,多余的字符将被截断。因此对于中文字,被截断的情况可以分成三类:

l中文字的三分之一编码被截去;

l中文字的三分之二编码被截去;

l中文字的全部编码被截去。

第三类就是不出现乱码的情况,其他两类就会出现乱码。因此,理论上只要把出现乱码的字符串的最后一个或者最后两个编码去除,就可以将该字符串变成合法的字符串,然后就可以进行导出操作了。经过对大量乱码数据的分类归纳,发现这些乱码数据的最后第一个或者最后第二个字符是有规律的,它的ASCII码都大于191。

解决对策:

制作相应的数据库数据乱码修正工具,对所有的varchar和text类型的字段进行检测,如果发现数据的最后一个或者最后第二个字符的编码值大于191,就进行对应的截取,具体代码如下:

update TableName set ColumnName=substring(ColumnName,1, DefineLength-2) where char_length(workName)=DefineLength and ASCII(RIGHT(ColumnName,2)) >191;

update TableName set ColumnName=substring(ColumnName,1, DefineLength-1) where char_length(workName)=DefineLength and ASCII(RIGHT(ColumnName,1)) >191;

难点二:

JDBC3.1版本使用的问题。

难点分析:

按照2.1.3的思路,将原来的JDBC版本进行了替换。在迁移的实验中发现该系统频繁出现“内存溢出”,“JSP无法编译”,“Servlet异常”等问题,导致系统无法正常运行。经过排查,发现问题出现在JDBC上,经过对3.1下所有小版本的验证,发现问题依旧存在。2.1.2节中曾提到,称3.0版的JDBC可以支持5.0版MYSQL的基本功能,因此更换了当时的最新版本3.0.16版本进行尝试。经过验证,3.1下的所有问题都消失了,系统能够稳定运行了。

但是,在迁移工作继续开展中发现了另一个问题:带参的SQL语句无法成功,但对应的SQL在命令行中是能够运行成功的。这表明了程序和数据库都是没有问题的,唯一的可能是问题出在JDBC上,有可能这个版本的JDBC不支持PreStatement的SQL操作。但3.0.16是当时的最新版本了,3.1版本虽然是支持PreStatement的SQL操作,但因为前面提到的问题而无法使用,这是否意味着,迁移工作无法完成呢?这时候,突然发现MYSQL官网上两天前发布了3.0的更新版本3.0.17[5]。替换后验证,3.0.16上的问题解决了,同时3.1上的问题也没有再现。

解决对策:

使用3.0.17版本的JDBC作为该系统连接MYSQL5.0的JDBC。经过验证,该JDBC也同时支持MYSQL4.0的连接。当然,如果不使用3.0.17版本的JDBC的话, SQL操作就需要修改为非PreStatement方式来执行了,这样的修改代价是比较大的。

2.2.4迁移的成果总结

按照迁移的基本方法开展工作,同时对一些难点进行了成功的攻克,整个迁移实验取得了理想的成果。

首先,证明了该系统由MYSQL4.0向5.0进行迁移是可行的。既包括系统全新部署,也包括原有系统的升级。

其次,在实验过程中,获取了MYSQL4.0和MYSQL5.0在使用上差异性的汇总表,根据该汇总表可以对现有的数据库结构和程序进行修改;同时也可以指导开发人员在今后的开发中如何设计出同时符合MYSQL4.0和MYSQL5.0要求的数据表结构,也能编写出满足这2种数据库要求的代码。具体的汇总表见表2。

表2 MYSQL4.0和5.0功能差异对比

MYSQL4.0

MYSQL5.0

int类型字段

允许插入''

不允许插入'' ,只能插入null值

int类型字段

设置为非空,仍可以插入null值

设置为非空,就不允许插入null值

Float类型字段

float(5,2)类型,可以输入任意浮点数

当输入大于999.99的数时,抛出异常;

Varchar类型字段

标记为非空,可以不插入值;

标记为非空,必须插入值;

Varchar类型字段

允许插入''

不允许插入'' ,只能插入null值

Varchar类型字段

varchar(99)只能存放33个中文字符

varchar(99)能存放99个中文字符

Varchar类型字段

Varchar上限为255,

varchar上限为1000

Varchar类型字段

空格不被计数

空格被计数

Varchar类型字段

“/”不被计数

“/”被计数

Date类型字段

0000-00-00合法

0000-00-00不合法

DateTime类型字段

精确到0秒

精确到0.1秒

0能否强制转化为Number类型

不能

设置为联合主键的字段能否插入null

不能

联合索引的总容量

无限制

不能超过1000bytes

自增长类型是否需要设置成key或索引

“Condition”是否可以作为字段名

建表语句中

表名两端的空格会自动过滤

表名两端的空格不会自动过滤

建表语句中

最后一个字段后跟逗号,不会报错

最后一个字段后跟逗号,会报错

findRecord函数

可以执行insert操作

不能执行insert操作

ResultSet.getObject函数

获取数字类型为integer

获取数字类型为long型

再次,系统代码对MYSQL5.0的兼容性修改完毕。共修改49处问题,涉及45个java文件;同时对该系统的建库脚本进行了完善,共修改了8个SQL语句。

3解决方案总结及实例应用

在完成迁移实验后,紧接着开展了测试验证工作。测试验证工作一方面补充和完善了迁移的成果,另一方面确保了升级后程序的稳定性和兼容性。从而一个完整的该系统数据库升级方案已经形成。

3.1解决方案总结

1.对于新部署的系统,方案相对简单:

(1)部署好MYSQL5.0,配置编码方式:UTF-8。

(2)执行修改后的建库脚本。

(3)将修改后的程序部署到Tomcat下,启动服务器。

即完成了基于MYSQL5.0的新系统部署。

2.对于旧系统从MYSQL4.0升级到5.0,具体方案如下:

(1)停止旧的Web服务,保证升级过程中无新数据产生。

(2)执行数据库兼容性升级工具(修改不兼容的字段名,字段类型,字段的默认值,表的主键值,以及去除字符型数据中的乱码)

(3)Dump出MYSQL4.0中的数据文件

(4)部署好MYSQL5.0,配置编码方式:UTF-8

(5)将该数据文件导入MYSQL5.0中;

(6)将修改后的程序部署到Tomcat下,启动服务器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql数据库表升级方案_一个基于mysql数据库的项目的升级解决方案小结(节选) 的相关文章

  • Duplicated 与unique

    gt DT lt data table A rep 1 3 each 4 B rep 1 4 each 3 C rep 1 2 6 key A B gt DT A B C 1 1 1 1 2 1 1 2 3 1 1 1 4 1 2 2 5
  • 【OpenCV学习笔记】【教程翻译】二(车牌识别算法框架)

    在介绍自动车牌识别的代码之前 我们需要定义自动车牌识别算法的主要步骤和任务 自动车牌识别主要分为两步 车牌检测和车牌识别 车牌检测的目的是检测出车牌在整副图像中的位置 当一副图片中的车牌被检测出来了 然后就是第二步 车牌识别 车牌识别使用O
  • 华为OD机试 - MELON的难题(Java)

    题目描述 MELON有一堆精美的雨花石 数量为n 重量各异 准备送给S和W MELON希望送给俩人的雨花石重量一致 请你设计一个程序 帮MELON确认是否能将雨花石平均分配 输入描述 第1行输入为雨花石个数 n 0 lt n lt 31 第
  • Web前端开发 移动端开发(快速入门)

    目录 一 理论知识 1 视口 2 物理像素和物理像素比 3 二倍图 4 移动端开发选择 二 移动端开发流程 1 技术选型 2 搭建文件结构 3 SEO优化3大标签 4 设置favicon ico logo图片 5 视口标签和初始化样式 6
  • 粉丝福利—这本热门机器学习书籍,你值得免费拥有

    粉丝福利 机器学习书籍免费大放送 1 粉丝福利 2 抽奖方式 各位小伙伴们 大家好 为了回馈粉丝们的支持 小编给大家送来一波福利 闲言少叙 咱们直接进入正题 1 粉丝福利 为答谢AI研习图书馆广大粉丝朋友们长久以来的支持 本号发起免费赠书活
  • vue项目怎么修改项目名称

    1 在package json文件中 修改name成你想要的新名字 2 删掉node modules文件夹 3 修改根目录下面的index html文件中的title 改完以后 vue文件中的title就改过来了 4 重新下载依赖 npm
  • 业务架构视图该怎么画?

    业务架构全景视图是快速理解业务运作形态的重要工具 该视图不应以IT视角绘制 业务元素及其结构应是绘制重点 商业模式画布中业对务元素进行了标准化 将其业务活动展开可得到一份精炼的业务全景视图 两者可互为补充 由于篇幅限制和认知曲线 应该控制全
  • 2020年 IEEE VIS 科学可视化与体渲染论文整理与分析

    因为最近工作的关系 需要研究一下IEEE VIS中2017年以后的与我之前主要方向 体渲染 医学可视化 有关的论文 我把这些年全部的论文进行了筛选和梳理 总共筛选出57篇论文 打算写一个文章来记录这些内容 这个栏目是2020年的5篇论文的介
  • 把Collection转化为XML

    IList
  • zlib库源码编译

    文章目录 zlib库源码编译 简介 源码编译 Windows vs2017 64位版本编译 zlib库源码编译 简介 该篇博客主要用于记录zlib库的源码编译方法 根据自己在源码编译过程中踩得坑进行记录 既便于后续自己学习 也希望能够帮助他
  • SDK 开发中见到的问题

    问题1 Could not build module MySDK 原因是 在pubulic的头文件中导入的头文件都需要导入到pubulic中 m文件中头文件不需要导入 问题2 Missing submodule subHeader 原因是
  • PyDev Eclipse使用技巧说明

    PyDev Package Explorer 创建项目 在开展工作之前 需要创建一个新的项目 在 Eclipse 菜单栏中 选择 File gt New gt Project gt Pydev gt Pydev Project 单击 Nex
  • 求函数【线段树】【2020牛客寒假算法基础集训营2】

    首先 这个区间很容易让人想到是区间操作 那么就是来推公式吧 我们从中不难发现 从两个值到四个值 可以是相当于 其中 两个 括号中的值是不是有点相似 我们是不是可以将它放在线段树上来进行维护了 include
  • CVPR 2022

    作者 cocoon 编辑 3D视觉开发者社区 前言 FAIR又出新作了 一篇 2020年代的卷积网络 的横空出世 让国内外CV圈的眼光都聚焦于此 不少大牛都纷纷下场参与讨论 研究团队以Transformer的一些设计原则以及训练技巧为标 尽
  • 引用与指针有什么区别?

    引用与指针有什么区别 指针和引用都是地址的概念 指针指向一块内存 它的内容是所指内存的地址 引用是某块内存的别名 程序为指针变量分配内存区域 而不为引用分配内存区域 指针使用时要在前加 引用可以直接使用 引用在定义时就被初始化 之后无法改变
  • Java 异常

    目录 1 自己不处理 交给调用者处理 1 1 throws 声明一个异常 1 2 throw 抛出一个异常 2 自己处理异常 2 1 try catch 2 2 try catch的常见问题 3 Throwable 的成员方法 4 自定义异
  • [2021.9.13][OpenGL ES 3.0编程指南]1 OpenGL ES 3.0简介

    1 1 OpenGL ES 3 0 OpenGL ES 3 0实现了具有可编程着色功能的图形管线 由两个规范组成 OpenGL ES 3 0 API规范和OpenGL ES着色语言3 0规范 图1 1展示了OpenGL ES 3 0 图形管
  • java网络编程01——网络基本概念

    阅读 java网络编程 等诸多资料个人所思所想读书笔记 1 网络 因特网 两种方式回答问题 其一是描述因特网的基本构成即构成因特网的基本硬件和软件组件 其二根据分布式应用提供服务的联网基础设施描述因特网 因特网是世界范围的计算机网络 即是一
  • 服务器光信号闪红灯是什么意思,路由器光信号闪红灯是什么意思

    现在不少宽带在安装之后还需要配备一个路由器用来接收光纤信号 在路由器上会有几个指示灯 如果你的路由器信号灯一直闪红灯知道是什么意思吗 一起来了解一下吧 闪红灯的意思 宽带 费 现在宽带基本都是后付费模式 因为 费的时间太 运营商直接关掉了宽

随机推荐

  • 矩阵通高效监管企业新媒体矩阵,账号集中管理与运营数据分析

    越来越多的企业在全网布局旗下账号 希望通过社媒传播矩阵 以内容连接产品与用户 达成增加销售线索或扩大品牌声量的目的 构建矩阵的优势在于 内容能多元发展 聚集不同平台流量 多种营销渠道自主掌控 分散单一平台传播风险 各平台账号间也能协同互补
  • JavaScript中Math.max()和Math.min()方法

    JavaScript中Math max 和Math min 方法 Math是JavaScript中的对象 不是构造函数 可以用来执行数学任务 1 Math max max 返回给定的一组数据中的最大值 但是不接收数组作为参数 参考用法
  • vue3.0 兼容ie浏览器

    vue3 0 兼容ie浏览器 安装babel polyfill npm install save babel polyfill 在main js里面引入 一定要在最上面 第一行 import babel polyfill 安装完成后会有ba
  • HTML页面结构

  • Unity实现点击显示不同UI

    在开发过程中经常遇到切换显示不同UI的需求 实现方案有2套 1 创建两个场景A B 在A中点击某个button后触发切换事件后加载B场景现在新的场景信息 优点 是逻辑简单 在不同的场景中创建对应的UI即可 缺点是当两个场景中有重复显示的模型
  • 高德地图JSAPIvue项目的使用

    最近在项目中使用高德地图JSAPI 遇到一些问题整理一下做个总和记录 希望能帮到看到文章的大家 1 关于引用 npm i amap amap jsapi loader save 然后创建好地图容器后引入地图 注意避坑的点 1 使用loca可
  • vue指令实现埋点

    1 自定义指令 import Vue from vue 自定义埋点指令 Vue directive track 钩子函数 只调用一次 指令第一次绑定到元素时调用 在这里可以进行一次性的初始化设置 el 指令所绑定的元素 可以用来直接操作 D
  • Linux 读文件 - readahead预读算法

    顺序读场景 intmain charc 4096 intin 1 in open news txt O RDONLY intindex 0 while read in c 4096 4096 printf index d len ld n
  • linux 内核 - ioctl 函数详解

    linux 内核 ioctl 函数详解 1 概念 ioctl 是设备驱动程序中设备控制接口函数 一个字符设备驱动通常会实现设备打开 关闭 读 写等功能 在一些需要细分的情境下 如果需要扩展新的功能 通常以增设 ioctl 命令的方式实现 在
  • leetcode 907. 子数组的最小值之和

    给定一个整数数组 arr 找到 min b 的总和 其中 b 的范围为 arr 的每个 连续 子数组 由于答案可能很大 因此 返回答案模 10 9 7 leetcode题目链接 示例 1 输入 arr 3 1 2 4 输出 17 解释 子数
  • 根据数据库名生成数据库结构说明

    根据数据库名生成数据库结构说明 package com cjm common import java io File import java io FileOutputStream import java sql Connection im
  • 文件上传优化

    文件上传优化 文件的名称需要优化 服务端 保存的文件名称如果固定 那么最终会导致服务器硬盘 只会保留一个文件 对上传的文件名称优化 System currentTimeMillis new Random nextInt 1000000 jp
  • CMake - 报错:Missing variable is: CMAKE_FIND_LIBRARY_PREFIXES

    问题描述 今天学习ZeroMQ 写了一个HelloWorld的测试程序 cmake的时候 报错Missing variable is CMAKE FIND LIBRARY PREFIXES 具体CMakeLists txt内容为 cmake
  • 【第29篇】MAE:屏蔽自编码器是可扩展的视觉学习器

    文章目录 摘要 1 简介 2 相关工作 3 方法 4 ImageNet 实验 4 1 主要属性 4 2 与之前结果的比较 4 3 局部微调 5 迁移学习实验 6 讨论与结论 摘要 论文链接 https arxiv org abs 2111
  • js将后台返回的数据转化为树形结构(扁平数组转树状结构)

    前言 做项目使常遇到需要将后台返回的数据 转换为树状结构给用户展现 例如 这也是前端面试常考的算法题 一起来检测一下吧 步骤 准备一个空的树对象 遍历列表中的每个元素 对于每个元素 根据该元素的父级ID找到其对应的父节点 如果找到了父节点
  • 如何开始使用 Python 3 编程:入门

    Python 是世界上发展最快的编程语言 这种流行的编程语言已帮助无数设计师 科学家和工程师努力解决当今消费者和企业面临的重大问题 使用 Python 更智能地工作 什么是 Python 编程 Python 编程是编写代码以执行任务或解决问
  • 小象课堂在线授课教育系统

    此项目包含后端全部代码 前端包括后台和web界面的源码 数据库用的mysql 可当作课设或者毕设 还可写入自己的简历中 web界面展示 前端后台界面展示 用户管理 课程管理 内容配置 订单管理 系统管理 系统监控
  • 概述-数据服务是什么?

    数据服务是什么 我以前认为 数据服务 就是通过数据接口提供数据的方式的统称 就是你调用一个接口 我传给你一些数据 数据处理逻辑接口内已经封装了 用这些数据你可以处理某些问题 而直接查询数据的不是数据服务 后来看了 大数据之路 阿里巴巴大数据
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • mysql数据库表升级方案_一个基于mysql数据库的项目的升级解决方案小结(节选)

    1引言 数据库使用MYSQL4 0版本 随用用户数的逐步增多 因为数据库版本过低而引起的抱怨也越来越多 不足也越来越明显 首先 对产品化部署产生了制约 由于MYSQL4 0数据库的配置文件my ini是存放在Windows的系统目录下的 同