当前位置: 首页 > 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下生成的文件名

八、总结

相关文章:

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

一、什么是ORM ORM是在数据库和编程语言之间建立一种映射关系&#xff0c;这样可以让我们有非常简单的代码&#xff0c;来实现各种数据库的操作。 例如&#xff1a;使用mysql去查找表&#xff08;表名称为Articles&#xff09; SELECT * FROM Articles;但是我们使用ORM的话&…...

STM32-Modbus协议(一文通)

Modbus协议原理 RT-Thread官网开源modbus RT-Thread官方提供 FreeModbus开源。 野火有移植的例程。 QT经常用 libModbus库。 Modbus是什么&#xff1f; Modbus协议&#xff0c;从字面理解它包括Mod和Bus两部分&#xff0c;首先它是一种bus&#xff0c;即总线协议&#xff0c;和…...

100. 不同方向的投影视图

本节课给大家讲解&#xff0c;通过UI按钮界面交互改变threejs相机的观察视角。 x轴方向观察 // 通过UI按钮改变相机观察角度 document.getElementById(x).addEventListener(click, function () {camera.position.set(500, 0, 0); //x轴方向观察camera.lookAt(0, 0, 0); //重新…...

Appium中的api(三)

目录 Appium中的api(三) 1.输入和清空内容 1--输入内容 2--清空内容 2.获取文本内容 3.获取文本位置 4.获取文本的大小&#xff08;即获取控件的宽和高&#xff09; 5.滑动api 6.拖拽api 7.如何获取手机分辨率 8.如何截图 9.模拟按键事件api 10.操作通知栏 案例:App自动化模拟 …...

踩坑:关于使用ceph pg repair引发的业务阻塞

概述 在某次故障回溯中&#xff0c;发现引发集群故障&#xff0c;slow io&#xff0c;pg stuck的罪魁祸首竟是做了一次ceph pg repair $pgid。然而ceph pg repair作为使用频率极高的&#xff0c;用来修复pg不一致的常用手段&#xff0c;平时可能很少注意其使用规范和可能带来的…...

瞬间升级!电子文档华丽变身在线题库,效率翻倍✨

&#x1f44b;嘿小伙伴们&#xff0c;有个超赞的秘籍要告诉你们——土著刷题能将你的电子文档一键变身在线题库&#xff01;&#x1f609; 你还没发现这个宝藏功能吗&#xff1f;快来瞧瞧&#xff01; &#x1f31f;是不是常被一堆电子版的学习资料搞得头昏脑涨&#xff0c;学习…...

如何动态改变本地的ip

在当今数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。无论是出于隐私保护、突破地域限制&#xff0c;还是为了测试和优化网络应用&#xff0c;动态改变本地IP地址的需求日益增多。本文将详细介绍如何安全、有效地实现这一目标&#xff0c;旨在帮…...

Spring Boot框架在中小企业设备管理中的创新应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…...

Ceph入门到精通-Osd db扩容

ceph-bluestore-tool 是一个在 BlueStore 实例上执行低级管理操作的实用程序。 以下命令可用于 ceph-bluestore-tool 语法 ceph-bluestore-tool COMMAND [ --dev DEVICE … ] [ -i OSD_ID ] [ --path OSD_PATH ] [ --out-dir DIR ] [ --log-file | -l filename ] [ --deep ]c…...

windows msvc2017 x64编译AWS SDK CPP库

在本文中&#xff0c;我们将介绍如何编译AWS SDK C库&#xff0c;以便在您的项目中使用。AWS SDK C库提供了与Amazon Web Services交互的接口&#xff0c;允许您在C应用程序中使用AWS服务。 一、准备工作 在开始编译AWS SDK C库之前&#xff0c;请确保您的系统已经安装了以下…...

铜业机器人剥片 - SNK施努卡

SNK施努卡有色行业电解车间铜业机器人剥片 铜业机器人剥片技术是针对传统人工剥片效率低下、工作环境恶劣及生产质量不稳定的痛点而发展起来的自动化解决方案。 面临人工剥片的诸多挑战&#xff0c;包括低效率、工作环境差、人员流动大以及产品质量控制不精确等问题。 人工剥片…...

非接触式竖向位移、水平位移视频实时在线监测的设备分类及选型

前言 视觉是人工智能正在快速发展的一个分支&#xff0c;简单说来&#xff0c;机器视觉就是用机器代替人眼来做测量和判断。在结构健康自动化监测方面&#xff0c;机器视觉采用光学图像结合智能算法和物联网技术&#xff0c;利用先进的智能靶标识别及亚像素处理等技术&#xff…...

Svelte 5 正式发布:新一代前端框架!

10 月 22 日&#xff0c;Svelte 5 正式发布&#xff01;该版本带来的更新主要包括&#xff1a; 重写框架&#xff1a;Svelte 5 是从头开始重写的&#xff0c;使得应用更快、更小、更可靠&#xff0c;并且代码更一致和符合习惯。 向后兼容&#xff1a;Svelte 5 几乎完全向后兼容…...

85.【C语言】数据结构之顺序表的中间插入和删除及遍历查找

目录 3.操作顺序表 1.分析中间插入函数 函数的参数 代码示例 图片分析 main.c部分改为 在SeqList.h添加SLInsert函数的声明 运行结果 2.分析中间删除函数 函数的参数 代码示例 图片分析 main.c部分改为 在SeqList.h添加SLErase函数的声明 运行结果 承接84.【C语…...

触觉智能Purple Pi OH鸿蒙开发板成功适配OpenHarmony5.0 Release,开启新征程!

10月22日&#xff0c;触觉智能Purple Pi OH鸿蒙开发板迎来了重大系统版本升级&#xff0c;成功适配OpenHarmony5.0 Release&#xff0c;为嵌入式开发者和科技爱好者们带来了全新的机遇与挑战&#xff01; 触觉智能 Purple Pi OH 开发板一直以来都以其高品质和超高性价比而著称。…...

分布式解决方案---分布式ID

目录 是什么 特点 全局唯一 高并发 高可用 怎么做 实现方案 是什么 分布式ID是指在分布式系统中生成的唯一标识符。由于分布式系统的特点&#xff0c;多个节点可能会同时生成ID&#xff0c;因此需要确保每个ID在整个系统中是唯一的。 重点就是唯一性&#xff01;&#x…...

httpd服务

文章目录 1、搭建一个网络yum源2、基于域名访问的虚拟主机3、基于端口来访问域名4、搭建个人网站5、加密访问显示自定义网页内容 1、搭建一个网络yum源 [roottest01 conf.d]# cat repo.conf <virtualhost *:80>documentroot /var/www/html/ServerName 10.104.43.154ali…...

Linux系统安装Redis详细操作步骤(二进制发布包安装方式)

安装方式介绍 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照redhat的包管理规范进…...

Jenkins和Gitlab整合构建CI/CD流水线

配置环境 虚拟机建议4G起步 192.168.58.199 192.168.58.200 部署Jenkins 部署Jenkins参考这篇文章&#xff1a;Jenkins安装部署_connecting to pkg.jenkins.io (pkg.jenkins.io)|151.-CSDN博客 安装完毕之后根据下图操作 选择git&#xff0c;添加git仓库克隆url&#xff0c;选…...

14 C语言中的关键字

C语言中的关键字 在C语言中&#xff0c;关键字是一些预定义的单词&#xff0c;它们具有特殊的意义和用途。这些关键字不能用作标识符&#xff0c;比如变量名、函数名等&#xff0c;因为它们被保留用于特定的语言结构和操作。 关键字的分类 C语言的关键字可以分为几个主要类别…...

(11)(2.1.7) FETtec OneWire ESCs(一)

文章目录 前言 1 去哪里买 2 连接 3 组态 前言 &#xff01;Note 此功能在固件版本 4.1.1 及更高版本上可用。 OneWire 是 FETtec 的 ESC 双向通信协议(ESC bi-directional communication protocol)。 FETtec OneWire ESC 的遥测信息被发送回自动驾驶仪&#xff1a; 电…...

Python 异步编程:使用 `asyncio.to_thread` 和 `asyncio.Queue` 处理任务队列

Python 异步编程&#xff1a;使用 asyncio.to_thread 和 asyncio.Queue 处理任务队列 1. 什么是 asyncio.to_thread&#xff1f;2. 什么是 asyncio.Queue&#xff1f;3. 示例代码&#xff1a;使用 asyncio.to_thread 和 asyncio.Queue 处理任务队列示例代码代码解释运行结果 4.…...

【问题解决】Flink在linux上运行成功但是无法访问webUI界面

一&#xff0c;问题 在搭建Flink的时候&#xff0c;已经在linux服务器上运行了./start-cluster.sh&#xff0c; 而且日志显示已经成功了。 服务器上也没有开启防火墙 正常来说应该能通过ip:8081来访问(8081是Flink WebUI的默认端口)&#xff0c;但是访问的时候&#xff0c;显示…...

【问题解决】pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

今天配置完poetry环境变量之后pnpm不能用了 具体报错 pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1pnpm run dev~~~~ Ca…...

微信网页授权回调地址放多个参数的方法

https://open.weixin.qq.com/connect/oauth2/authorize?appidAPPID&redirect_uriREDIRECT_URI&response_typecode&scopeSCOPE&stateSTATE#wechat_redirect 跳转后地址 redirect_uri/?codeCODE&stateSTATE。 redirect_uri如果不进行urlencode编码, 跳转后…...

相机工作距离计算

镜头 基础参数 焦距 ​ 例如&#xff0c;使用1英寸靶面(12.8mm x 9.6mm)的相机&#xff0c;工作距离WD是300mm&#xff0c;视野FOV的高度是120mm&#xff0c;那么光学放大倍率&#x1d6fd; 9.6&#x1d45a;&#x1d45a;/120&#x1d45a;&#x1d45a;0.08 &#xff0c;…...

Pandas模块之垂直或水平交错条形图

目录 df.plot() 函数Pandas模块之垂直条形图Pandas模块之水平交错条形图 df.plot() 函数 df.plot() 是 Pandas 中的一个函数&#xff0c;用于绘制数据框中的数据。它是基于 Matplotlib 库构建的&#xff0c;可以轻松地创建各种类型的图表&#xff0c;包括折线图、柱状图、散点…...

ArcGIS必会的选择要素方法(AND、OR、R、IN等)位置选择等

今天来看看ArcGIS中的几个选择的重要使用方法 1、常规选择、 2、模糊查询、 3、组合复合条件查询&#xff08;AND、OR、IN&#xff09;&#xff0c; 4、空值NULL查询 5、位置选择 推荐学习&#xff1a; 以梦为马&#xff0c;超过万名学员学习ArcGIS入门到实战的应用课程…...

快速创建一个微信小程序,详细步骤以及示范程序代码

创建一个微信小程序涉及前端和后端的搭建与联调。以下是一个快速创建微信小程序的详细步骤以及示范程序代码。 一、注册微信小程序账号 前往微信公众平台&#xff0c;注册一个小程序账号并完成相关设置。注册完成后&#xff0c;获取小程序的AppID&#xff0c;这是后续开发过程…...

【继承】讲解

访问控制 传递下去可以一共分为四个特性 公有保护私有存在但不可见 虽然它们各自的特性不同&#xff0c;能不能使用也另说&#xff0c;但是在建立类对象的时候&#xff0c;系统都会申请相应的内存&#xff0c;也就是说&#xff0c;无论它们能不能用&#xff0c;它们都存在。 …...

怎样做一个微信小程序/谷歌优化的网络公司

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号&#xff0c;然后就会core dump) 在程序运行的过程中&#xff0c;有的时候我们会遇到Segment fa…...

网吧手机网站模版/站长之家ip地址查询

// // Name: CameraClass.h // Des: 一个封装了实现虚拟摄像机的类的头文件 // 2013年 3月10日 Create by 浅墨 //#pragma once#include <d3d9.h> #include <d3dx9.h>class CameraClass { private://成员变量的声明D3DXVECTOR3 m_vRightVector; …...

正邦 网站建设/不花钱网站推广

原文&#xff1a;http://coolketang.com/staticDesign/5a97b8c39f5454403c50830f.html1. 本节课将为您详细讲解渐变面板的使用。首先选择文档中的黑色图形。 2. 然后点击工具栏底部的[渐变]图标&#xff0c;给图形填充渐变颜色。渐变是指两个或多个颜色的渐变混合。 3. 接着依次…...

Windows wordpress搭建/制造企业网站建设

亳州教育网2021蒙城中考成绩查询录取结果入口亳州市教育局网站(http://jyj.bozhou.gov.cn)是2021蒙城中考官方网站&#xff0c;亳州教育局官网jyj.bozhou.gov.cn提供2021蒙城中考成绩查询、蒙城中考报名、志愿填报、高中招生录取查询等信息&#xff0c;广大考生可以登录亳州教育…...

厦门建设局网站城市建设/广告推广精准引流

首先&#xff0c;说明一下为什么要写这么一篇文章。很多朋友电话问&#xff0c;老师我对网络很感冒&#xff0c;但是不知道怎么样去学习&#xff1f;如果你也有这样的疑问&#xff0c;那么就很有必要看看下文了&#xff1a;三国的时候&#xff0c;魏、蜀、吴三家最后都同归于晋…...

家具网站建设案例/市场监督管理局是干什么的

/**处理金额的千分位转为数字**/ functio StrToNumber(obj){var reg /^[0-9].?[0-9]*$/; //验证字符串是否是数字if (!(reg.test(obj))) {//为字符串 则判断是否存在,if((obj"").replace(/^\s\s*/, ).replace(/\s\s*$/, )""){return 0.00 ;}if(obj unde…...