当前位置:   article > 正文

[Python造轮子]从零实现一个类关系型数据库_关系数据库代码实现

关系数据库代码实现

前言

进入IT这一行也有几个年头了,该听闻的技术,大都没有遗漏,所以广度上的扩展,不太急迫了,但深度上的扩展,还有很多要做的工作,所以就觉得从 “造轮子” 这方面切入,慢慢扩展自己的深度了。
借助于实现一个数据库,笔者主要的目的有三个:
1.深入了解一个数据库的底层原理,以及要从零实现的话,要包含哪些模块,如何实现
2.这次实现的数据库是玩具级别的,几乎不需要测试我就能知道其具有非常多的缺陷,性能也很低,但这次实现是为以后实现更为复杂的轮子做准备,比如实现一个分布式数据库,GPU数据库等等。
3.强化python的编程

为什么要实现一个数据库

可能有些读者会问,就算是造轮子,为什么选择造数据库?其实主要的原因有如下几个:
一来数据库是IT界历史悠久,非常常见的产品,其底层凝聚了计算机发展以来的很多精华思想,比如性能优化啊,通信协议啊(如果数据库是分布式的话)等等。因此,如果真的从零实现一个数据库的话,肯定对数据结构,搜索算法,计算机网络这些知识更为精通,这对自己的技术成长有很多的帮助;

二来,笔者是一个算法工程师,尤其接触非常多的大数据业务场景,所以会很在意"性能"有关的东西。所以,杠数据库对笔者来说,既能培养算法能力,又能提高自己对”性能“的理解,做得知其然知其所以然。

数据库地址

目前代码笔者放于Github仓库上了,有兴趣的读者可以去clone下来,自己测试一下,更有兴趣的,可以拆了轮子,重新造一个。我的微信:jiedemaikena,有兴趣可以多多交流。

造的数据库实现到了什么程度

首先,直接贴图,直观感受一下:
clone数据库下来后,运行test4.py:

运行test4.py
test4.py

运行test3.py
在这里插入图片描述
在这里插入图片描述
基本的增删查改,笔者是实现了,操作起来跟MySQL差不多,实际上几乎就是按着MySQL的操作习惯造出来的。

认真负责的说,笔者实现的数据库仅仅是达到能用的水平(因为存储是基于python的list,可想而知速度有多慢)!跟MySQL这些,没得比的(实际上这个项目是为了练手,为以后实现一个更为靠近MySQL的数据库做准备)


目前数据库有的性能:

  • 支持增删查改四种操作,不支持join,groupBy等高级操作,后期会加
  • 数据存储跟关系型数据库格式一致,结构化,有严格顺序,每列每行都等长
  • 数据库支持数据约束,包含自增约束,唯一约束,非空约束,主键约束,支持设置默认值。

目前,支持增删查改的命令如下:

增:INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

删: DELETE FROM 表名称 WHERE 列名称 = 值

更新:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

查:SELECT 列名称 FROM 表名称 WHERE 列名称 = 值

where后面的条件判断可以是 (>,>=,<.<=,!=,=,like,range(…),in,not in)

数据库目前没有实现的东西:

  • B+树索引
  • 读写锁
  • SQL优化器

可能还有一些核心模块笔者没有写,但笔者实现的数据库,缺少的这些模块,才是数据库真正的灵魂,目前笔者知识水平有限,就先搁置了,但以后肯定会来挑战的。


数据库架构

首先来看一张图:
在这里插入图片描述
database,table,字段(Field)这三个概念完全对应着MySQL中的概念:进入MySQL后,要选择一个数据库(database),然后数据库中有多个table,每个table有很多列字段(Field)。

那代码要怎么写?

说了这么多,还是要回到怎么编写这轮子的第一句代码中?很多人可能听到要从零实现一个数据库,感觉代码量大的不行,非常难,完全不知道从哪下手。其实只要好好理清造数据库,最起码有哪几个板块就可以了。

首先要实现一个Field模块,即要编写一个类,这个类能够总结好Field应该有什么特性:

  1. 长度检验,数据类型检验,数据约束检验
  2. 值的存储(毕竟值最后就是存在Field中)
  3. 增删查改(增数据时要检验数据是否满足类型要求,还要满足数据约束)
  4. 数据的序列化反序列化

之后要实现Table模块,Table直接的处理对象不再是某个值,而是Field,就是说,就算是增删查改,Table模块也是基于Field模块完成,因此需要满足:

  1. 数据的增删查改
  2. 数据表的序列化反序列化

在这时,需要实现一个很核心的函数 __parse_conditions,其作用是,得到被删查改的条件。

然后到database模块了,其操作对象变成了Table了,因此需要满足:

  1. 删除表,新增表
  2. 序列化数据库和反序列

Field,Table,Database这三者就是数据库的核心了。但用户对数据库的操作不是直接操作这三个类,而应该有个专属的操作类,这个操作类直接操作这三个对象(严格来说,是操作database模块,然后由database模块往下调用),这个操作类叫做Engine模块。

除此之外,Engine模块还负责SQL命令行交互的实现,所以,这个轮子中,最核心的部分就是Engine模块。

Engine模块需要满足的功能:

  1. 选择,删除,增加数据库
  2. 对选定数据库的表进行增删查改
  3. 实现SQL命令行交互,支持在命令行桌面输入SQL,返回相应的消息

既然说到了输入SQL,比如输入select * from t_test where f_id = 1,where之后的部分,我们可以称之为筛选条件,这个部分笔者用了一个parser模块来实现,并且为了支持parser解析的功能,还需要一个条件判断case模块。

在这里插入图片描述

总结一下,数据库需要实现如下几个部分:
  1. Field,table,database模块,数据库的基础,内部模块
  2. Engine模块,实现对数据库内部模块的调用
  3. parser模块,协助Engine模块达到操作数据库的目的。功能是解析SQL命令where后面的查询条件,并返回给Engine,由Engine去找出符合条件的数据
  4. case模块,辅助parser模块。主要实现>=<等大小比较的功能

暂时就写这么多吧,如果以后有东西要补充的话,慢慢写。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/561474
推荐阅读
相关标签
  

闽ICP备14008679号