什么是orm?

ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。不负责任的总结就是通过类似对象管理的模式,来管理数据库,来避免直接操作数据库,降低数据库的学习成本。

如果还是不懂? 可以直接看看阮一峰的这篇文章 ORM实例教程

现有基于Node的ORM

  • sequelize
  • openrecord

为什么要造轮子?

  • 了解某些语法是怎样实现的
  • 巩固基础
  • 构造自己更满意的语法糖
  • 好玩

所以这篇文章比较适合有这些相同想法的同学阅读,并且整篇文章会比较基础,大佬们可以在这里止步了。

功能设计

要实现一个功能库,首先我们得设计我们有哪些功能,回忆下大学数据库课程里面的那几个大流程,我们要做的也不尽相同。

  • 连接

连接

连接当然是我们orm的最基础的功能,所以我们设计如下:

module.exports.connect = config => {// create sql pool connect
}

一个对外暴露的config, 本质上就是将创建连接池所需参数对外再暴露一次,并且加上一些自己想要定制的参数即可。

比如我这里是有个debug模式,开启后会输出所有执行的sql语句,当然你也可以再这里埋一些callback,用于实现获取记录日志的能力。

{limit:          : 10,host            : '127.0.0.1',port            : '3306',user            : 'root',password        : 'root',database        : 'test',debug           : true
}

具体连接池怎么创建的就不说了,看看mysql的文档就行了,唯一要记得就是用单例模式创建连接,每次sql操作结束后记得释放connect就行

增,删,改,查

说白了这4个就是我们最核心的操作,但是如何设计呢?

看看相关的orm库就知道了,每张表都看成一个对象,增删改查是他的属性方法,所以既然是orm,我们当然要把他设计成对象的操作模式,如下:

module.exports.model = data => {// return new instance
}
const student = orm.model(data)

我们在model 函数初始化时会给它传一些参数,比如表名,状态,表字段,主键字段等,让他初始化的时候可以存储起来,最后再返回一个新的实例,比如下面这样:

const student = orm.model('student', {name: String,sex: Number
})

然后model上就会有很多我们想要的属性方法,并且每一类方法都对应一类sql,这样就可以实现我们的增,删,改,查了。

student.create()
student.find()
student.where()
student.update()
student.delete()// create sql demo
create(data) {const keys = Object.keys(data).join(',')const values = Object.values(data).map(d => escape(d)).join(',')const SQL = `insert into ${table} (${keys}) VALUES (${values})`
}

结束或许是新的开始

到这里大家根据上面的伪代码,应该可以创建一个最基础的伪orm,勉勉强强的可以满足你大部分基础操作(当然我相信你在整合这些方法的时候一定会踩更多的坑,如果需要帮助可以看看我的实现)。

这里再回到我们之前提的“为什么要造轮子”,上面介绍的只是一些实现的大致流程和基础的回顾。

但是如何构造我们更满意的语法糖?如何更好玩?

比如下面的代码:

(async () => {console.log(await orm.Model('Post')) // 获取到post表的数据console.log(await orm.Model('Post').find(1)) // 获取到post表里id=1的数据
})()

所以在最后抛出一个问题,如何实现上述的这种类似惰性的链式调用功能?

下面是我的实现方案:

yuanhaoyu/h-orm​github.com

sql 2008 每次打开一个表都要登录_如何实现一个简易的orm相关推荐

  1. 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?

    编辑器加载中... 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?多表联结查询:select rbd.RBDID, rbd.ProductCode,p.ProductCnName,p. ...

  2. 【奇葩问题】每次打开excel文件都会出现两个窗口,一个是空白的sheet1,另一个是自己的文档

    程序员的奇葩问题又增加了,问题如题:每次打开excel文件都会出现两个窗口,一个是空白的sheet1,另一个是自己的文档 一切的源头在于前段时间装了MySQL数据库,他就自动加载了两者之间的关联启动项 ...

  3. wps表格宏被禁用如何解禁_(wps表格怎么设置宏)为什么每次打开excel文件都要提示启用或者禁用宏?...

    打开Excel时出现"该工程中的宏被禁止",怎么启用宏? 启用宏的方法(2003 版): 工具 → 宏 → 安全性 → 安全级 → 中 关闭Excel → 重新打开 → 启用宏 - ...

  4. SQL数据库中如何把一个表中的数据复制到另一个表中?

    SQL数据库中如何把一个表中的数据复制到另一个表中?** 1整个表复制:** insert into table1 select * from table2 2部分列复制:** insert into ...

  5. oracle将表导入到表空间,关于ORALCE一个表空间的数据导入到另一个表空间的方法(原创)...

    用户:   whnaproject     所属表空间: whnaproject 新用户   : wniec            所属新表空间: wniec 要求:将用户whnaproject中的数 ...

  6. mysql存储过程没有此表_mysql用存储过程写入 一个表A中没有存在在另一个表B的数据...

    需求 Abiao id content 1 sfsdfsg 2 ddsgffd 3 gfggg 4 dggfhfd Bbiao id 2 3 那么我要查询到Abiao 里面在Bbiao没有的数据 (理 ...

  7. 每次打开unity脚本都新开一个vs解决方法

    unity版本:5.4.5f1 vs版本:2015 最近使用windows的unity开发项目,突然遇到一个很坑的问题,就是每次打开脚本都会新打开一个vs. 但是换了个unity版本,或者换个项目打开 ...

  8. mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)

    索引使用简介 一. 关于索引的知识 要写出运行效率高的sql,需要对索引的机制有一定了解,下面对索引的基本知识做一介绍. 1. 索引的优点和局限 索引可以提高查询的效率,但会降低dml操作的效率. 所 ...

  9. OLEDB不使用SQL语句直接打开数据表

    一般来说获取数据库表的方法是采用类似 select * from table_name 这样的sql语句.SQL语句必然伴随着数据库的解释执行,一般来说效率比较低下,而且使用SQL语句时需要数据库支持 ...

最新文章

  1. numpy 读写 npy npz 文件
  2. Nature Chemistry | 化学机器学习的最佳实践:推荐的一套标准化指南
  3. 浏览器和服务器 对http请求(post get) url长度限制
  4. _disable_logging 对于归档数据库的影响
  5. QT 建立信号和槽的联系(事件处理)
  6. Spring Boot——SpringMVC带URL前缀的静态资源解决方案
  7. c++标准模板库STL【快速查找】【最全】【常用】【语法】
  8. 将信息像存银行一样存在数据中心
  9. java mongodb 聚合函数_MongoDB的聚合函数 Aggregate
  10. [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
  11. mysql linux查看配置文件my.cnf位置
  12. mysql 系统工程师_数据库系统工程师难考吗?
  13. docker网络端口映射
  14. 沧小海深入剖析xilinx的GTP/GTX核,掌握高速串行收发机制——第六章 接收端结构及功能说明
  15. C++面向对象(1):防卫式声明
  16. 开题报告中的研究目的与研究内容怎么写?
  17. Gartner 2016数据仓库和数据分析数据库管理解决方案魔力象限
  18. 解决方案│POL全光校园解决方案 光纤到教室解决方案 光纤到宿舍解决方案
  19. websocket重连机制
  20. Mathtype部分数学符号只能显示方框时的解决办法

热门文章

  1. 从底部上滑失灵_iPad 上这 20 个快捷操作,真正帮你提高生产力!
  2. 用matlab绘制中国海岸线,matlab显示全球海岸线
  3. ios双指放大缩小_用PS设计APP过程中改进IOS设计流程的30个秘诀
  4. Java虚拟机(JVM)之类的加载过程详解
  5. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论微服务架构及其应用)
  6. 04Linux与Unix的关系
  7. Python机器学习:评价分类结果001准确度和混淆矩阵
  8. java 给图片添加暗水印_java 实现给图片添加水印
  9. 开源上网行为管理_做好企业上网行为管理作用大
  10. centos7 dns配置_Linux Sever简单笔记(第十三堂课)之linux下的网络管理及DHCP配置的相关操作 - 我杨晓东太难了...