文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Nodejs中koa2怎么连接mysql

2023-07-02 18:00

关注

本文小编为大家详细介绍“Nodejs中koa2怎么连接mysql”,内容详细,步骤清晰,细节处理妥当,希望这篇“Nodejs中koa2怎么连接mysql”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

将查询结果转为对象或者数组

在真实开发中,实际上某些查询结果应该放入到一个对象中

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 brandFROM products LEFT JOIN brand ON products.brand_id = brand.id;

Nodejs中koa2怎么连接mysql

在多对多关系中,我们希望查询到的是一个数组:

Nodejs中koa2怎么连接mysql

SELECT stu.id, stu.name, stu.age,JSON_ARRAYAGG(JSON_OBJECT('id', cs.id, 'name', cs.name)) as coursesFROM students stuLEFT JOIN students_select_courses ssc ON stu.id = ssc.student_idLEFT JOIN courses cs ON ssc.course_id = cs.idGROUP BY stu.id;

mysql2的使用

安装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();});

Prepared Statement(预处理语句)

提高性能:将创建的语句模块发送给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 Pools(连接池)

前面我们是创建了一个连接(connection),但是如果我们有多个请求的话,该连接很有可能正在被占用,那么我们是否需要每次一个请求都去创建一个新的连接呢?

判断是否连接成功

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);});

Promise方式

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);});

sequelize

对象关系映射(ORM):是一种程序设计的方案:

Node当中的ORM我们通常使用的是sequelize;

如果我们希望将Sequelize和MySQL一起使用,那么我们需要先安装两个东西:

npm install sequelize mysql2

Sequelize的使用

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);});

Sequelize的单表操作

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();//执行这个函数可以实现对数据库的操作

Sequelize的一对多操作

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();

Sequelize的多对多操作

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 CourseStudent.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”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯