一、什么是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区
。这样在查询的时候,时间才不会出错。
那么同样的,也简单的给test
和production
也调整一下。
五、使用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
这张表里面所拥有的字段了,比方说id
、title
、content
,这些外还出现了两个时间字段createdAt
和updatedAt
。
这两个字段,当在新增或修改数据的时候,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下生成的文件名