knex与sequelize 以及断点工具使用

knex 使用

SQL Query Builder for Javascript | Knex.js

首先下载

npm install  knex

使用

const knex = require('knex')({client: 'mysql',connection: {host: 'localhost',  // 地址user: 'root',       // 账号password: '123456', // 密码database: 'user'    // 数据库}});/***  knex 查询那个表*  select 查询的字段*  where  查询字段数据*/
knex('user').select('login_name', 'password').where({ login_name: loginName });

knex提供了函数来拦截数据(类似于生命周期)

这些钩子函数可以通过调用knex.on()方法进行注册,在查询被执行时会按照注册的顺序依次调用这些钩子函


// before: 该钩子函数在查询被执行前被调用,可以用来修改查询参数或验证用户权限等操作。
knex.on('query', (data) => {console.log('before query:', data)
});// after: 该钩子函数在查询被执行后被调用,可以用来处理查询结果或记录查询日志等操作。
knex.on('query-response', (data) => {console.log('after query:', data)
});
//  error: 该钩子函数在查询发生错误时被调用,可以用来记录错误信息或通知开发人员等操作。
knex.on('query-error', (error, data) => {console.log('query error:', error, data)
})

                   

knex 批量新增数据

使用 Knex 批量插入数据可以通过 insert 方法的链式调用实现。具体实现步骤如下:

  1. 准备数据,将需要插入的数据存储在数组中。

  2. 调用 insert 方法,传入数组参数。

下面是一个示例代码:

复制const data = [{ name: 'Alice', age: 20 },{ name: 'Bob', age: 21 },{ name: 'Charlie', age: 22 }
];knex('users').insert(data).then(() => console.log('Data inserted successfully')).catch((err) => console.error(err));

在上面的示例中,我们将一个包含 3 条记录的数组 data 批量插入到 users 表中。insert 方法返回一个 Promise,当插入操作完成时,我们可以在 then 中执行后续操作,例如打印成功信息;当插入操作失败时,我们可以在 catch 中捕获错误并执行相应的错误处理逻辑。

分页

const express = require('express');
const knex = require('knex');
const app = express();// 连接到数据库
const db = knex({client: 'sqlite3',connection: {filename: './database.sqlite'}
});// 分页接口
app.get('/api/users', async (req, res) => {const page = req.query.page || 1;     // 当前页码const perPage = req.query.perPage || 10;  // 每页条目数const offset = (page - 1) * perPage;   // 偏移量// 查询总数const countQuery = db('users').count('id as count');const [{ count }] = await countQuery;// 查询分页数据const dataQuery = db('users').select('id', 'name', 'email').limit(perPage).offset(offset);const data = await dataQuery;res.json({data,totalCount: count,currentPage: page,perPage});
});app.listen(3000, () => {console.log('Server started on http://localhost:3000')
});

 sequelize                                                             

 Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。

模型查询(基础) | Sequelize中文文档 | Sequelize中文网

 Sequelize 遵从 语义版本控制。 支持 Node v10 及更高版本以便使用 ES6 功能。

连接数据库

const { Sequelize, Model, DataTypes
} = require("sequelize");
const connect = async () => {const sequelize = new Sequelize("数据库名字","用户","密码",{host: "", // 地址dialect: "mysql", // 类型port: 3306, // 端口timezone: "+08:00",define: {timestamps: false, //true表示给模型加上时间戳属性(createAt、updateAt),false表示不带时间戳属性freezeTableName: true, //true表示使用给定的表名,false表示模型名后加s作为表名}});
};module.exports = connect;

简单使用完成增删改查

建立表的模型

简单封装一下

const { DataTypes } = require("sequelize");
const sequelize = require("../config/database");
const { v4: uuid } = require("uuid")
const errorModule = async () => {const model = sequelize.define("sys_errors", {id: {type: DataTypes.STRING,allowNull: false,primaryKey: true,defaultValue: uuid().replace(/-/g, "")  // id默认值},host: {type: DataTypes.STRING},name: {type: DataTypes.STRING},requestURL: {type: DataTypes.STRING,field: "request_url"},createTime: {type: 'datetime',field: "create_time"},})return model.sync({ force: false });
}module.exports = errorModule

简单查询

attributes: 查询当前表的哪些字段

where: 条件 

order: 用来定义排序规则

limit 查询的数量

offset:  偏移数量   limit通常配合offset来实现分页查询

User.findAll({attributes: [],where: {},order: [["createTime", "DESC"], // 按 createTime 字段降序排序],limit:0,offset:0,
});

 简单新增

params: 创建的数据  

User.create(params);

简单修改

params 修改的参数  

where 条件  

// 将所有没有姓氏的人更改为 "Doe"
await User.update({ lastName: "Doe" }, {where: {lastName: null}
});

简单删除

// 删除所有名为 "Jane" 的人 
await User.destroy({where: {firstName: "Jane"}
});

SELECT 查询特定属性

选择某些特定属性,可以使用 attributes 参数:

Model.findAll({attributes: ['foo', 'bar']
});

可以使用嵌套数组来重命名属性:

Model.findAll({attributes: ['foo', ['bar', 'baz'], 'qux']
});

SELECT foo, bar AS baz, qux FROM ...

你可以使用 sequelize.fn 进行聚合:

Model.findAll({attributes: ['foo',[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats'],'bar']
});

 SELECT foo, COUNT(hats) AS n_hats, bar FROM ...

查询总数

where查询的条件   

const amount = await User.count({where: {}
});

maxmin 和 sum 

Sequelize 还提供了 max,min 和 sum 便捷方法.

假设我们有三个用户,分别是10、5和40岁.

await User.max('age'); // 40
await User.max('age', { where: { age: { [Op.lt]: 20 } } }); // 10
await User.min('age'); // 5
await User.min('age', { where: { age: { [Op.gt]: 5 } } }); // 10
await User.sum('age'); // 55
await User.sum('age', { where: { age: { [Op.gt]: 5 } } }); // 50

 排序和分组

User.findAll({order: [// 将转义 title 并针对有效方向列表进行降序排列['title', 'DESC'],// 将按最大年龄进行升序排序sequelize.fn('max', sequelize.col('age')),// 将按最大年龄进行降序排序[sequelize.fn('max', sequelize.col('age')), 'DESC'],// 将按 otherfunction(`col1`, 12, 'lalala') 进行降序排序[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],// 将使用模型名称作为关联名称按关联模型的 createdAt 排序.[Task, 'createdAt', 'DESC'],// 将使用模型名称作为关联名称通过关联模型的 createdAt 排序.[Task, Project, 'createdAt', 'DESC'],// 将使用关联名称按关联模型的 createdAt 排序.['Task', 'createdAt', 'DESC'],// 将使用关联的名称按嵌套的关联模型的 createdAt 排序.['Task', 'Project', 'createdAt', 'DESC'],// 将使用关联对象按关联模型的 createdAt 排序. (首选方法)[Subtask.associations.Task, 'createdAt', 'DESC'],// 将使用关联对象按嵌套关联模型的 createdAt 排序. (首选方法)[Subtask.associations.Task, Task.associations.Project, 'createdAt', 'DESC'],// 将使用简单的关联对象按关联模型的 createdAt 排序.[{model: Task, as: 'Task'}, 'createdAt', 'DESC'],// 将由嵌套关联模型的 createdAt 简单关联对象排序.[{model: Task, as: 'Task'}, {model: Project, as: 'Project'}, 'createdAt', 'DESC']],// 将按最大年龄降序排列order: sequelize.literal('max(age) DESC'),// 如果忽略方向,则默认升序,将按最大年龄升序排序order: sequelize.fn('max', sequelize.col('age')),// 如果省略方向,则默认升序, 将按年龄升序排列order: sequelize.col('age'),// 将根据方言随机排序(但不是 fn('RAND') 或 fn('RANDOM'))order: sequelize.random()
});Foo.findOne({order: [// 将返回 `name`['name'],// 将返回 `username` DESC['username', 'DESC'],// 将返回 max(`age`)sequelize.fn('max', sequelize.col('age')),// 将返回 max(`age`) DESC[sequelize.fn('max', sequelize.col('age')), 'DESC'],// 将返回 otherfunction(`col1`, 12, 'lalala') DESC[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],// 将返回 otherfunction(awesomefunction(`col`)) DESC, 这种嵌套可能是无限的![sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']]
});

基本使用完成增删改查

多表关联查询

 比如我们有两个表, 一个user用户表, 一个dept部门表

 需求:  查询用户要返回用户的部门信息

User 表示user的模型, Dept 代表dept的模型

我们通过使用 hasMany 和 belongsTo 来实现关联

在这里我们是根据用户查部门, 用户表为主, 部门表为次

hasOne:有一个,加上主谓语应该是 ,1有一个 2
hasMany:有很多,1 有很多 2
belongsTo:属于, 1属于 2 

表2.hasMany(表1,{foreignKey: 表1中关联字段 , targetKey: 表2中的字段  })

表1.belongsTo(表2, {
        foreignKey: 表1中关联字段,
        targetKey: 表2中的关联字段,
});

 Dept.hasMany(User, { foreignKey: "deptid", targetKey: "id" });User.belongsTo(Dept, {foreignKey: "id",targetKey: "deptId",
});

Sequelize 支持标准关联关系: 一对一, 一对多 和 多对多.

为此,Sequelize 提供了 四种 关联类型,并将它们组合起来以创建关联:

  • HasOne 关联类型
  • BelongsTo 关联类型
  • HasMany 关联类型
  • BelongsToMany 关联类型

该指南将讲解如何定义这四种类型的关联,然后讲解如何将它们组合来定义三种标准关联类型(一对一, 一对多 和 多对多).

const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);A.hasOne(B); // A 有一个 B
A.belongsTo(B); // A 属于 B
A.hasMany(B); // A 有多个 B
A.belongsToMany(B, { through: 'C' }); // A 属于多个 B , 通过联结表 C
创建一个 一对一 关系, hasOne 和 belongsTo 关联一起使用;
创建一个 一对多 关系, hasMany he belongsTo 关联一起使用;
创建一个 多对多 关系, 两个 belongsToMany 调用一起使用

A.hasOne(B) 关联意味着 A 和 B 之间存在一对一的关系,外键在目标模型(B)中定义.A.belongsTo(B)关联意味着 A 和 B 之间存在一对一的关系,外键在源模型中定义(A).A.hasMany(B) 关联意味着 A 和 B 之间存在一对多关系,外键在目标模型(B)中定义.

操作符

Sequelize 提供了多种运算符.

const { Op } = require("sequelize");
Post.findAll({where: {[Op.and]: [{ a: 5 }, { b: 6 }],            // (a = 5) AND (b = 6)[Op.or]: [{ a: 5 }, { b: 6 }],             // (a = 5) OR (b = 6)someAttribute: {// 基本[Op.eq]: 3,                              // = 3[Op.ne]: 20,                             // != 20[Op.is]: null,                           // IS NULL[Op.not]: true,                          // IS NOT TRUE[Op.or]: [5, 6],                         // (someAttribute = 5) OR (someAttribute = 6)// 使用方言特定的列标识符 (以下示例中使用 PG):[Op.col]: 'user.organization_id',        // = "user"."organization_id"// 数字比较[Op.gt]: 6,                              // > 6[Op.gte]: 6,                             // >= 6[Op.lt]: 10,                             // < 10[Op.lte]: 10,                            // <= 10[Op.between]: [6, 10],                   // BETWEEN 6 AND 10[Op.notBetween]: [11, 15],               // NOT BETWEEN 11 AND 15// 其它操作符[Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)[Op.in]: [1, 2],                         // IN [1, 2][Op.notIn]: [1, 2],                      // NOT IN [1, 2][Op.like]: '%hat',                       // LIKE '%hat'[Op.notLike]: '%hat',                    // NOT LIKE '%hat'[Op.startsWith]: 'hat',                  // LIKE 'hat%'[Op.endsWith]: 'hat',                    // LIKE '%hat'[Op.substring]: 'hat',                   // LIKE '%hat%'[Op.iLike]: '%hat',                      // ILIKE '%hat' (不区分大小写) (仅 PG)[Op.notILike]: '%hat',                   // NOT ILIKE '%hat'  (仅 PG)[Op.regexp]: '^[h|a|t]',                 // REGEXP/~ '^[h|a|t]' (仅 MySQL/PG)[Op.notRegexp]: '^[h|a|t]',              // NOT REGEXP/!~ '^[h|a|t]' (仅 MySQL/PG)[Op.iRegexp]: '^[h|a|t]',                // ~* '^[h|a|t]' (仅 PG)[Op.notIRegexp]: '^[h|a|t]',             // !~* '^[h|a|t]' (仅 PG)[Op.any]: [2, 3],                        // ANY (ARRAY[2, 3]::INTEGER[]) (PG only)[Op.match]: Sequelize.fn('to_tsquery', 'fat & rat') // 匹配文本搜索字符串 'fat' 和 'rat' (仅 PG)// 在 Postgres 中, Op.like/Op.iLike/Op.notLike 可以结合 Op.any 使用:[Op.like]: { [Op.any]: ['cat', 'hat'] }  // LIKE ANY (ARRAY['cat', 'hat'])// 还有更多的仅限 postgres 的范围运算符,请参见下文}}
});

断点工具调试

谷歌浏览器进入 

chrome://inspect/#devices

 是这个界面

 项目启动程序中

加入 inspect

node --inspect app.js

 此时打开  chrome://inspect/#devices

 点击inspect

 此时就已经进入断点调试工具

了Knex之外,还有以下几个Node.js中类似于Knex的模块:

  1. Sequelize:一个基于Promise的ORM框架,支持PostgreSQL、MySQL、MariaDB、SQLite和Microsoft SQL Server。

  2. Bookshelf:一个ORM框架,基于Knex构建,支持PostgreSQL、MySQL和SQLite。

  3. Massive.js:一个数据访问库,支持PostgreSQL、MySQL、MariaDB、SQLite、Amazon Redshift和CockroachDB。

  4. TypeORM:一个ORM框架,支持MySQL、PostgreSQL、MariaDB、SQLite、Microsoft SQL Server、Oracle、WebSQL等数据库。

  5. Waterline:一个ORM框架,支持多种数据源,包括MySQL、PostgreSQL、MongoDB、Redis、API等。

这些模块都提供了类似于Knex的功能,使得Node.js应用程序能够更方便地与各种数据库进行交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React-组件基础使用

组件是什么 概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观&#xff0c;组件之间可以互相嵌套&#xff0c;也可以复用多次 组件化开发可以让开发者像搭积木一样构建一个完整的庞大的应用 React组件 在React中&#xff0c;一个组件就是首…

云动态摘要 2024-05-24

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]大模型知识引擎体验招募 腾讯云 2024-05-21 大模型知识引擎产品全新上线&#xff0c;为回馈新老客户&#xff0c;50万token免费送&#xff0c;开通服务即领取&#xff01; 云服…

git教程(IDEA + 命令行)

首先假设你已经安装 git 且 已经初始化完成&#xff1a; // 初始化git config --global user.name "你的用户名" git config --global user.email "你的邮箱"在当前文件夹下创建一个仓库&#xff0c;且该文件夹下会有多个项目 首先在当前文件夹下新建git…

微信小程序毕业设计-校园综合服务系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

VSCode开发Python-Django入门

一、安装配置Python环境及配置Python环境变量 1、python安装包安装后&#xff0c;需要注意pip.exe和pip3.exe的安装&#xff1b; 2、环境变量需要配置两个目录&#xff1b; 3、验证python是否安装成功 通过cmd命令执行&#xff1a;python --version 查看python版本&#xff…

高中生是否需要上电子阅览室

高中生是否需要上电子阅览室&#xff0c;取决于学生的学习需求和个人喜好。以下是一些考虑因素&#xff1a; 1. 便利性&#xff1a;电子阅览室通常提供电脑设备和网络连接&#xff0c;方便学生在线获取学习资源。对于家中没有电脑或者网络不稳定的学生&#xff0c;上电子阅览室…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一&#xff1a;模拟支付宝蚂蚁森林的能量产生过程 支付宝的蚂蚁森林通过日常的走步、生活缴费、线下支付、网络购票、共享单车等低碳、环保行为…

java函数编程-黑马学习笔记

第一章 01合格的函数 函数就是一个规则 合格的函数就是只要你输入相同&#xff0c;无论多少次调用&#xff0c;不论什么时间调用&#xff0c;输出是相同的。 函数可以引用外部的数据&#xff0c;但是需要去保证外部的数据不可变 static关键字修饰的静态方法本质上和函数没…

XDebug配置几件教程,phpstorm实现http请求断点调试

写这篇的文章的初衷:网络上配置XDebug的文章有很多,XDebug也有官方的文档, PhpStorm也有官方的文档,为什么还要写那? 相信不少人,都有一种感觉,虽然教程很多,但是按教程走一遍,自己的确不能正常调试。 问题出在下面几个方面: 1. 对调试过程中,没有一定的认识,因此…

HBase分布式数据库入门到精通

文章目录 HBase分布式数据库入门到精通 一、简单介绍 二、HBase数据模型 三、HBase的架构 四、HBase写操作流程 五、HBase读操作流程 六、HBase minor小合并和major大合并 七、HBase目标表meta表 八、HBase特点 九、HBase的使用场景 HBase分布式数据库入门到精通 一、…

没开玩笑!高速信号不能参考电源网络这条规则,其实很难做到

高速先生成员--黄刚 看到这篇文章的题目&#xff0c;我相信大家心里都呈现出了这么一个场景&#xff1a;高速信号线在L20层&#xff0c;我只要把L19和L21层都铺上完整的地平面&#xff0c;这不就满足了高速信号线不能参考电源平面这条规则了吗&#xff1f;这难道很难做到吗&…

鸿蒙大厂目前政策变现沉淀思考

鸿蒙引擎定制优化 鸿蒙端hotfix&#xff1a; 技术栈太大了&#xff0c;但是鸿蒙需要学习什么呢&#xff1f; 什么最有价值&#xff1f; 这就是接下来需要表达下我的观点&#xff1a; 1、APP开发 2、应用市场技术专员 【游戏、电商重型APP性能的处理 SmartPerf、构建自己的工…

JVM、JRE 和 JDK 的区别,及如何解决学习中可能会遇到的问题

在学习Java编程的过程中&#xff0c;理解JVM、JRE和JDK之间的区别是非常重要的。它们是Java开发和运行环境的核心组件&#xff0c;各自扮演不同的角色。 一、JVM&#xff08;Java Virtual Machine&#xff09; 定义 JVM&#xff08;Java虚拟机&#xff09;是一个虚拟化的计算…

EE trade:如何理解做空黄金

理解做空黄金&#xff0c;其实就是理解卖空操作在黄金市场中的应用。卖空&#xff0c;或称为做空&#xff0c;是指投资者预测某资产(在这个例子中是黄金)的价格会下跌&#xff0c;因此采取的一种投资策略。 下面简要说明做空黄金的过程和相关概念&#xff1a; 借入黄金: 首先…

Android 生成正式版密钥库 KeyStore

步骤1&#xff1a;打开生成正式版密钥库设置 点击 Build 菜单&#xff0c;选择 Generate Signed App Bundle or APK&#xff1a; 这是打开后的样子&#xff1a; 步骤2&#xff1a;选择 APK Android App Bundle 是用于上架 Google Play 商店的。 正常情况下选择 APK。 选择…

提升(或降低)插入的内容的位置:\raisebox

\raisebox 是 LaTeX 中的一个命令&#xff0c;用于提升&#xff08;或降低&#xff09;插入的内容&#xff08;如文本、图像等&#xff09;的位置。该命令可以用于调整垂直位置&#xff0c;使内容相对于周围内容上下移动。 语法如下&#xff1a; \raisebox{<distance>}…

探秘网页内容提取:教你定位特定标签

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、定位带有ID属性的第二个标签 三、定位具有特定属性值的标签 四、提取含有特…

分类内按规则拆分一行变多行

Excel的A列是分类列&#xff0c;B列是由">"连接起来的多个字符串&#xff0c;可以看成是合并后的明细&#xff1a; AB1IDRule: Condition2470210642217Test3470251569449Doors & Hardware > Door Jambs> 119mm4470251602217Bathroom > Stone Tops &…

富唯智能镀膜上下料设备采用最新的技术

现代工业竞争日趋激烈&#xff0c;高效生产已成为企业持续发展的关键。我们的设备不仅实现了高速上下料&#xff0c;更通过智能化控制系统实现了对生产流程的精准监控和调整&#xff0c;轻松应对高强度生产需求。 1、快速响应&#xff0c;高效生产 富唯智能镀膜上下料设备采用…

C++ 如何快速实现一个容器的迭代器

100编程书屋_孔夫子旧书网 引言 C++的标准库中的容器都会提供迭代器,如果一个容器满足forward_range,那么这个容器一般会提供以下成员类型和函数: iteratorconst_iteratorbeginendbegincend如果该容器还满足bidirectional_range,那么该容器还会额外提供以下成员类型和函数…