在真实开发中,实际上某些查询结果应该放入到一个对象中
JSON_OBJECT:()中是key-value的形式
SELECT products.id as id, products.title as title, products.price as price, products.score as score,
JSON_OBJECT('id', brand.id, 'name', brand.name, 'rank', brand.phoneRank, 'website', brand.website) as brand
FROM products LEFT JOIN brand ON products.brand_id = brand.id;
在多对多关系中,我们希望查询到的是一个数组:
比如一个学生的多门课程信息,应该是放到一个数组中的;
数组中存放的是课程信息的一个个对象;
这个时候我们要JSON_ARRAYAGG和JSON_OBJECT结合来使用;

SELECT stu.id, stu.name, stu.age,
JSON_ARRAYAGG(JSON_OBJECT('id', cs.id, 'name', cs.name)) as courses
FROM students stu
LEFT JOIN students_select_courses ssc ON stu.id = ssc.student_id
LEFT JOIN courses cs ON ssc.course_id = cs.id
GROUP BY stu.id;安装mysql2:
npm install mysql2
简单使用:
const mysql = require('mysql2');
// 1.创建数据库连接
const connection = mysql.createConnection({
host: 'localhost',
port: 3306,
database: 'coderhub',
user: 'root',
password: 'Coderwhy888.'
});
// 2.执行SQL语句
const statement = `
SELECT * FROM products WHERE price > 6000;
`
connection.query(statement, (err, results, fields) => {
console.log(results);
});如果我们想要在拿到数据后停止服务,可以在回调函数中写上:
connection.end()
完整代码:
connection.query(statement, (err, results, fields) => {
console.log(results);
connection.end();
});提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储
它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行,也只会编译一次,所以性能是更高的;
强调:如果再次执行该语句,它将会从LRU(Least Recently Used) Cache中获取获取,省略了编译statement的时间来提高性能。
// 2.执行SQL语句: 使用 ?来对参数进行占位
const statement = `
SELECT * FROM products WHERE price > ? AND score > ?;
`
connection.execute(statement, [6000, 7], (err, results) => {
console.log(results);
});前面我们是创建了一个连接(connection),但是如果我们有多个请求的话,该连接很有可能正在被占用,那么我们是否需要每次一个请求都去创建一个新的连接呢?
事实上,mysql2给我们提供了连接池(connection pools);
连接池可以在需要的时候自动创建连接,并且创建的连接不会被销毁,会放到连接池中,后续可以继续使用;
Mootion
Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。
232
查看详情
我们可以在创建连接池的时候设置LIMIT,也就是最大创建个数;
判断是否连接成功
const mysql = require('mysql2');
// 1.创建连接池
const connections = mysql.createPool({
host: 'localhost',
port: 3306,
database: 'coderhub',
user: 'root',
password: 'Coderwhy888.',
connectionLimit: 10
});
connections.getConnection((err, conn) => {
conn.connect((err) => {
if(err){
console.log('连接失败:',err)
} else {
console.log('数据库连接成功~')
}
})
})简单使用数据库
const mysql = require('mysql2');
// 1.创建连接池
const connections = mysql.createPool({
host: 'localhost',
port: 3306,
database: 'coderhub',
user: 'root',
password: 'Coderwhy888.',
connectionLimit: 10
});
// 2.使用连接池
const statement = `
SELECT * FROM products WHERE price > ? AND score > ?;
`
connections.execute(statement, [6000, 7], (err, results) => {
console.log(results);
});const mysql = require('mysql2');
// 1.创建连接池
const connections = mysql.createPool({
host: 'localhost',
port: 3306,
database: 'coderhub',
user: 'root',
password: 'Coderwhy888.',
connectionLimit: 10
});
// 2.使用连接池
const statement = `
SELECT * FROM products WHERE price > ? AND score > ?;
`
connections.promise().execute(statement, [6000, 7]).then(([results,fields]) => {
console.log(results);
}).catch(err => {
console.log(err);
});对象关系映射(ORM):是一种程序设计的方案:
从效果上来讲,它提供了一个可在编程语言中,使用虚拟对象数据库的效果;
Node当中的ORM我们通常使用的是sequelize;
Sequelize是用于Postgres,MySQL,MariaDB,SQLite和Microsoft SQL Server的基于Node.js 的ORM;
它支持非常多的功能;
如果我们希望将Sequelize和MySQL一起使用,那么我们需要先安装两个东西:
mysql2:sequelize在操作mysql时使用的是mysql2;
sequelize:使用它来让对象映射到表中;
npm install sequelize mysql2
Sequelize的连接数据库:
第一步:创建一个Sequelize的对象,并且指定数据库、用户名、密码、数据库类型、主机地址等;
第二步:测试连接是否成功;
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('coderhub', 'root', 'Coderwhy888.', {
host: 'localhost',
dialect: 'mysql'//连接的数据库类型:mysql,mongoose
});
sequelize.authenticate().then(() => {
console.log("连接数据库成功~");
}).catch(err => {
console.log("连接数据库失败~", err);
});const { Sequelize, DataTypes, Model, Op } = require('sequelize');
const sequelize = new Sequelize("coderhub", 'root', 'Coderwhy888.', {
host: 'localhost',
dialect: 'mysql'
})
//1.首先我们需要将数据库中的一张表映射成一个class类
class Product extends Model {}
Product.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,//主键
autoIncrement: true//自动增长
},
title: {
type: DataTypes.STRING,
allowNotNull: false//是否可以为空
},
price: DataTypes.DOUBLE,
score: DataTypes.DOUBLE
}, {//与数据库的表进行映射的配置
tableName: 'products',
createdAt: false,
updatedAt: false,
sequelize
});
//存放操作数据库的代码
async function queryProducts() {
//1.查询数据库中product表中所有的内容
const result1 = await Product.findAll({
where: {//在这里配置条件
price: {
[Op.gte]: 5000//意思是价格大于等于5000
//gte:大于等于,gt:大于,lt:小于,lte:小于等于
}
}
});
console.log(result1);
// 2.插入数据
const result2 = await Product.create({
title: "三星Nova",
price: 8888,
score: 5.5
});
console.log(result2);
// 3.更新数据
const result3 = await Product.update({
price: 3688
}, {
where: {
id: 1
}
});
console.log(result3);
}
queryProducts();//执行这个函数可以实现对数据库的操作const { Sequelize, DataTypes, Model, Op } = require('sequelize');
const sequelize = new Sequelize("coderhub", 'root', 'Coderwhy888.', {
host: 'localhost',
dialect: 'mysql'
});
//数据库的第一个表: 主表
class Brand extends Model {};
Brand.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNotNull: false
},
website: DataTypes.STRING,
phoneRank: DataTypes.INTEGER
}, {
tableName: 'brand',
createdAt: false,
updatedAt: false,
sequelize
});
//数据库的第二个表:附表
class Product extends Model {}
Product.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
title: {
type: DataTypes.STRING,
allowNotNull: false
},
price: DataTypes.DOUBLE,
score: DataTypes.DOUBLE,
brandId: {
field: 'brand_id',
type: DataTypes.INTEGER,
references: {//这张表使用了Brand的id作为外键
model: Brand,//product这张表使用了Brand这个表,所以product必须放在下面
key: 'id'
}
}
}, {
tableName: 'products',
createdAt: false,
updatedAt: false,
sequelize
});
// 将两张表联系在一起
Product.belongsTo(Brand, {
foreignKey: 'brandId'//外键
});
async function queryProducts() {
const result = await Product.findAll({
include: { //这里是联合查询:意思是包含别的表的信息
model: Brand
}
});
console.log(result);
}
queryProducts();const { Sequelize, DataTypes, Model, Op } = require('sequelize');
const sequelize = new Sequelize("coderhub", 'root', 'Coderwhy888.', {
host: 'localhost',
dialect: 'mysql'
});
// Student表
class Student extends Model {}
Student.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNotNull: false
},
age: DataTypes.INTEGER
}, {
tableName: 'students',
createdAt: false,
updatedAt: false,
sequelize
});
// Course表
class Course extends Model {}
Course.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNotNull: false
},
price: DataTypes.DOUBLE
}, {
tableName: 'courses',
createdAt: false,
updatedAt: false,
sequelize
});
// StudentCourse表:关系表
class StudentCourse extends Model {}
StudentCourse.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
studentId: {//与Student表建立关系
type: DataTypes.INTEGER,
references: {
model: Student,
key: 'id'
},
field: 'student_id'
},
courseId: {//与Course表建立关系
type: DataTypes.INTEGER,
references: {
model: Course,
key: 'id'
},
field: 'course_id'
}
}, {
tableName: 'students_select_courses',
createdAt: false,
updatedAt: false,
sequelize
});
// 多对多关系的联系:Student StudentCourse Course
Student.belongsToMany(Course, {
through: StudentCourse,
foreignKey: 'studentId',//这里是Student与StudentCourse,所以外键是studentId
otherKey: 'courseId'//StudentCourse与Course,所以外键是courseId
});
//与上面类似
Course.belongsToMany(Student, {
through: StudentCourse,
foreignKey: 'courseId',
otherKey: 'studentId'
});
async function queryProducts() {
const result = await Student.findAll({
include: {//所有学生的选课情况
model: Course
}
});
console.log(result);
}
queryProducts();以上就是Nodejs中koa2怎么连接mysql的详细内容,更多请关注其它相关文章!
# 组中
# 珠海网站推广专员工作
# 火锅品牌营销推广
# 跨境网站建设哪里好做呢
# 广州小红书营销推广方式
# 服装优惠劵推广网站
# 集团网站建设找哪家公司
# 毛戈平网络营销推广
# 木兰网站建设
# 淄博网站建设课件
# 营销推广方案ppt内容模板人物
# 如何设置
# MySQL
# 创建一个
# 查询结果
# 数据库中
# 连接数据库
# 这张
# 连接池
# 的是
# 镜像
# nodejs
# koa2
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战
雨课堂官网在线登录 网页版雨课堂登录链接
优化长HTML属性值:SonarQube警告与实用策略
c++如何使用std::thread::join和detach_c++线程生命周期管理
使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel
教资成绩怎么查询
在Django单元测试中优雅处理信号:基于环境的条件执行策略
Mac hosts文件在哪里_Mac修改hosts文件详细教程
苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤
优化CSS动画与J*aScript定时器协同:构建稳定Toast提示
mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法
告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度
济南公交卡手机充值指南
diskgenius分区工具如何设置Bios启动项
ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程
在Flask应用中安全高效地更新SQLAlchemy用户数据
如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色
《杖剑传说》食谱大全
如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?
视频转蓝光m2ts格式
《百度畅听版》关闭兴趣推荐方法
Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法
圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪
Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题
OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南
如何在CSS中使用absolute实现登录弹窗居中_transform translate结合
漫蛙漫画直连入口 _ manwa官方备用入口实时检测
向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法
天天漫画2025最新入口 天天漫画永久有效登录入口
Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧
优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理
C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧
如何编写一个符合 composer 规范的 post-install-cmd 脚本?
包子漫画在线观看入口 包子漫画网正版全集链接
以下哪一项是古代兵书三十六计中的计谋
菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤
如何查询国外邮政编码_国外邮政编码查询的多种有效途径
Python中深度嵌套字典与列表的数据提取与条件过滤指南
德邦快递收费标准详解
c++如何实现观察者设计模式_c++行为型设计模式实战
蜻蜓FM如何设置移动流量播放
ao3入口镜像地址 ao3镜像入口可靠跳转
教育查询官方网站入口 教育个人档案查询免费官网
申通快件单号查询平台 申通包裹物流动态跟踪
CSS如何使用outline-offset与颜色组合突出元素边框
汽水音乐官网网页版入口 汽水音乐官网网页版在线入口
斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来
WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程
C#解析来自网络的XML流数据 实时错误处理与重试机制
《三角洲行动》战斗步枪与机枪类改装代码分享
2023-06-01
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。