当前位置: 首页 > news >正文

node.js使用Sequelize ORM操作数据库

一、什么是ORM

ORM是在数据库和编程语言之间建立一种映射关系,这样可以让我们有非常简单的代码,来实现各种数据库的操作。

例如:使用mysql去查找表(表名称为Articles)

SELECT * FROM `Articles`;

但是我们使用ORM的话,就有更便捷的方法去查找表

Article.all()

Article,表示先找到Article这个模型。注意下,这里Article是单数形式,这并不是我写错了,而是 ORM 的就这么规定的。模型名是单数,对应的表名是复数。这样子,它就会自动找到Articles表上。all(),就是查询所有的数据了。整行的意思就是,查询Articles表的所有数据。

同样的,如果我想查询id=2的这条记录,也不用写

SELECT * FROM `Articles` WHERE `id`=2;

而会改为

Article.findByPk(2)

这里的findByPk,里面的Pk,就是primary key,也就是主键的缩写。我们表里id就是主键,说白了就是通过id来查找数据。

大家看,这样使用ORM来操作数据库后,明显要比写SQL简单的太多了,再也不用背那么多可恶的SQL语句了。但这也不是说用了ORM以后,就一点也不用懂SQL语句了。ORM它只是把我们写的代码,自动转换成SQL了再运行,在底层,实际上一样跑的还是SQL语句。

而且当我们开发中碰到问题了,要调试错误,依然要看命令行里面运行的SQL语句。所以就算开发中不写SQL,也一定要能看懂是什么意思。

二、配置Sequelize ORM

1.在命令行中全局安装

npm i -g sequelize-cli

2.接着确保命令行是在当前项目的命令行里,还要安装当前项目所依赖的sequelize包和对数据库支持依赖的mysql2

npm i sequelize mysql2

3.初始化项目

sequelize init

三、配置完成后的目录结构

  • config:是配置的意思,这里放的也就是sequelize所需要的连接数据库的配置文件。
  • migrations:是迁移的意思,如果你需要对数据库做新增表、修改字段、删除表等等操作,就需要在这里添加迁移文件了。而不是像以前那样,使用客户端软件来直接操作数据库。
  • models:这里面存放的是模型文件,当我们使用sequelize来执行增删改查时,就需要用这里的模型文件了。每个模型都对应数据库中的一张表。
  • seeders,是存放的种子文件。一般会将一些需要添加到数据表的测试数据存在这里。只需要运行一个命令,数据表中就会自动填充进一些用来测试内容的了。

四、配置config.js

{"development": {"username": "root","password": "yourpassword","database": "yourmysql","host": "127.0.0.1","dialect": "mysql","timezone": "+08:00"},"test": {"username": "root","password": null,"database": "yourtestmysql","host": "127.0.0.1","dialect": "mysql","timezone": "+08:00"},"production": {"username": "root","password": null,"database": "yourproductionmysql","host": "127.0.0.1","dialect": "mysql","timezone": "+08:00"}
}

第一个要改的就是密码,修改成docker配置里,我们设定的密码。接着要改的是数据库的名字,改为clwy_api_development

最下面,还要加上时区的配置,因为我们中国是在+8区。这样在查询的时候,时间才不会出错。

那么同样的,也简单的给testproduction也调整一下。

五、使用ORM创建一个表

sequelize model:generate --name Article --attributes title:string,content:text

打开models/article.js。可以看到,在模型文件夹中,出现了一个叫做Article的模型,它里面有标题和内容。

标题是字符串类型,对应到 MySQL 数据库里,它就会自动变成varchar。内容部分,则是text类型。

现在就只需要知道,模型就是用来操作数据库的,就是因为有这个文件的存在,我们后面才能使用Article.all()

六、迁移文件和运行迁移

1、迁移文件

看看migrations文件夹,里面出现了一个由当前时间,加上create-article命名的文件,这个文件就是迁移文件了。它的作用就是用来创建、修改表的。看到这里,在up部分。我们通过createTabel,创建了一个叫做Articles的表。

接着往下看,这些就是定义了Articles这张表里面所拥有的字段了,比方说idtitlecontent,这些外还出现了两个时间字段createdAtupdatedAt

这两个字段,当在新增或修改数据的时候,sequelize会自动的帮我们填写的。

2、运行迁移

sequelize db:migrate

打开数据库客户端,刷新一下,可以看到Articles表又神奇的出现了。看一看结构选项卡,里面的字段和我们当时自己手动创建的完全一样,而且还多了两个时间字段。这就是迁移文件的作用了。

另外一张表SequelizeMeta是我们运行迁移命令时,自动生成的。这张表里记录了当前已经跑过了哪些迁移,这样当你再次运行sequelize db:migrate时,已经运行过的迁移文件,就不会重复再次执行了。

七、种子文件

现在表也有了,下一步就是要填充一些在开发中用来测试的数据了。当然你可以用手动往里面一点点填,但很多情况我们做测试,可能需要非常多的数据。例如我希望数据库里有 100 篇文章,这时候,我们一条条的录入也太笨了点。最简单的方法就是使用种子文件了。再来试试这条命令

sequelize seed:generate --name article

完成后,在seeds目录,就看到刚才命令新建的种子文件了。同样也是分为两个部分,up部分用来填充数据,down部分是反向操作,用来删除数据的。

先来看up部分,默认生成的代码里,给了我们一个案例。很明显,它这里是往People表里,插入了一点儿数据。

await queryInterface.bulkInsert('People', [{name: 'John Doe',isBetaMember: false
}], {});

我们可以参考它的写法,改为往Articles表里插入数据。

async up (queryInterface, Sequelize) {const articles = [];const counts = 100;for (let i = 1; i <= counts; i++) {const article = {title: `文章的标题 ${i}`,content: `文章的内容 ${i}`,createdAt: new Date(),updatedAt: new Date(),};articles.push(article);}await queryInterface.bulkInsert('Articles', articles, {});
},

运行种子

sequelize db:seed --seed xxx-article

后边的文件名字每个人的创建时间都不同,文件名字也不同,详细看seeders下生成的文件名

八、总结

http://www.lryc.cn/news/468986.html

相关文章:

  • STM32-Modbus协议(一文通)
  • 100. 不同方向的投影视图
  • Appium中的api(三)
  • 踩坑:关于使用ceph pg repair引发的业务阻塞
  • 瞬间升级!电子文档华丽变身在线题库,效率翻倍✨
  • 如何动态改变本地的ip
  • Spring Boot框架在中小企业设备管理中的创新应用
  • Ceph入门到精通-Osd db扩容
  • windows msvc2017 x64编译AWS SDK CPP库
  • 铜业机器人剥片 - SNK施努卡
  • 非接触式竖向位移、水平位移视频实时在线监测的设备分类及选型
  • Svelte 5 正式发布:新一代前端框架!
  • 85.【C语言】数据结构之顺序表的中间插入和删除及遍历查找
  • 触觉智能Purple Pi OH鸿蒙开发板成功适配OpenHarmony5.0 Release,开启新征程!
  • 分布式解决方案---分布式ID
  • httpd服务
  • Linux系统安装Redis详细操作步骤(二进制发布包安装方式)
  • Jenkins和Gitlab整合构建CI/CD流水线
  • 14 C语言中的关键字
  • (11)(2.1.7) FETtec OneWire ESCs(一)
  • Python 异步编程:使用 `asyncio.to_thread` 和 `asyncio.Queue` 处理任务队列
  • 【问题解决】Flink在linux上运行成功但是无法访问webUI界面
  • 【问题解决】pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  • 微信网页授权回调地址放多个参数的方法
  • 相机工作距离计算
  • Pandas模块之垂直或水平交错条形图
  • ArcGIS必会的选择要素方法(AND、OR、R、IN等)位置选择等
  • 快速创建一个微信小程序,详细步骤以及示范程序代码
  • 【继承】讲解
  • 无人机之低空管控技术