欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nodejs中koa2連接mysql的實(shí)現(xiàn)示例

 更新時(shí)間:2022年07月13日 15:29:18   作者:小飛俠Pan  
本文主要介紹了Nodejs中koa2連接mysql的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

將查詢結(jié)果轉(zhuǎn)為對(duì)象或者數(shù)組

在真實(shí)開(kāi)發(fā)中,實(shí)際上某些查詢結(jié)果應(yīng)該放入到一個(gè)對(duì)象中

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;

在這里插入圖片描述

在多對(duì)多關(guān)系中,我們希望查詢到的是一個(gè)數(shù)組:

  • 比如一個(gè)學(xué)生的多門(mén)課程信息,應(yīng)該是放到一個(gè)數(shù)組中的;
  • 數(shù)組中存放的是課程信息的一個(gè)個(gè)對(duì)象;
  • 這個(gè)時(shí)候我們要JSON_ARRAYAGGJSON_OBJECT結(jié)合來(lái)使用;

在這里插入圖片描述

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的使用

安裝mysql2:

npm install mysql2

簡(jiǎn)單使用:

const mysql = require('mysql2');

// 1.創(chuàng)建數(shù)據(jù)庫(kù)連接
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'coderhub',
  user: 'root',
  password: 'Coderwhy888.'
});

// 2.執(zhí)行SQL語(yǔ)句
const statement = `
  SELECT * FROM products WHERE price > 6000;
`
connection.query(statement, (err, results, fields) => {
  console.log(results);
});

如果我們想要在拿到數(shù)據(jù)后停止服務(wù),可以在回調(diào)函數(shù)中寫(xiě)上:

connection.end()

完整代碼:

connection.query(statement, (err, results, fields) => {
  console.log(results);
  connection.end();
});

Prepared Statement(預(yù)處理語(yǔ)句)

提高性能:將創(chuàng)建的語(yǔ)句模塊發(fā)送給MySQL,然后MySQL編譯(解析、優(yōu)化、轉(zhuǎn)換)語(yǔ)句模塊,并且存儲(chǔ)
它但是不執(zhí)行,之后我們?cè)谡嬲龍?zhí)行時(shí)會(huì)給?提供實(shí)際的參數(shù)才會(huì)執(zhí)行;就算多次執(zhí)行,也只會(huì)編譯一次,所以性能是更高的;

強(qiáng)調(diào):如果再次執(zhí)行該語(yǔ)句,它將會(huì)從LRU(Least Recently Used) Cache中獲取獲取,省略了編譯statement的時(shí)間來(lái)提高性能。

// 2.執(zhí)行SQL語(yǔ)句: 使用 ?來(lái)對(duì)參數(shù)進(jìn)行占位
const statement = `
  SELECT * FROM products WHERE price > ? AND score > ?;
`
connection.execute(statement, [6000, 7], (err, results) => {
  console.log(results);
});

Connection Pools(連接池)

前面我們是創(chuàng)建了一個(gè)連接(connection),但是如果我們有多個(gè)請(qǐng)求的話,該連接很有可能正在被占用,那么我們是否需要每次一個(gè)請(qǐng)求都去創(chuàng)建一個(gè)新的連接呢?

  • 事實(shí)上,mysql2給我們提供了連接池(connection pools);
  • 連接池可以在需要的時(shí)候自動(dòng)創(chuàng)建連接,并且創(chuàng)建的連接不會(huì)被銷毀,會(huì)放到連接池中,后續(xù)可以繼續(xù)使用;
  • 我們可以在創(chuàng)建連接池的時(shí)候設(shè)置LIMIT,也就是最大創(chuàng)建個(gè)數(shù);

判斷是否連接成功

const mysql = require('mysql2');

// 1.創(chuàng)建連接池
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('數(shù)據(jù)庫(kù)連接成功~')
    }
  })
})

簡(jiǎn)單使用數(shù)據(jù)庫(kù)

const mysql = require('mysql2');

// 1.創(chuàng)建連接池
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.創(chuàng)建連接池
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

對(duì)象關(guān)系映射(ORM):是一種程序設(shè)計(jì)的方案:

  • 從效果上來(lái)講,它提供了一個(gè)可在編程語(yǔ)言中,使用虛擬對(duì)象數(shù)據(jù)庫(kù)的效果;

Node當(dāng)中的ORM我們通常使用的是sequelize;

  • Sequelize是用于Postgres,MySQL,MariaDB,SQLite和Microsoft SQL Server的基于Node.js 的ORM;
  • 它支持非常多的功能;

如果我們希望將Sequelize和MySQL一起使用,那么我們需要先安裝兩個(gè)東西:

  • mysql2:sequelize在操作mysql時(shí)使用的是mysql2;
  • sequelize:使用它來(lái)讓對(duì)象映射到表中;
npm install sequelize mysql2

Sequelize的使用

Sequelize的連接數(shù)據(jù)庫(kù):

第一步:創(chuàng)建一個(gè)Sequelize的對(duì)象,并且指定數(shù)據(jù)庫(kù)、用戶名、密碼、數(shù)據(jù)庫(kù)類型、主機(jī)地址等;

第二步:測(cè)試連接是否成功;

const { Sequelize } = require('sequelize');

const sequelize = new Sequelize('coderhub', 'root', 'Coderwhy888.', {
  host: 'localhost',
  dialect: 'mysql'//連接的數(shù)據(jù)庫(kù)類型:mysql,mongoose
});

sequelize.authenticate().then(() => {
  console.log("連接數(shù)據(jù)庫(kù)成功~");
}).catch(err => {
  console.log("連接數(shù)據(jù)庫(kù)失敗~", err);
});

Sequelize的單表操作

const { Sequelize, DataTypes, Model, Op } = require('sequelize');

const sequelize = new Sequelize("coderhub", 'root', 'Coderwhy888.', {
  host: 'localhost',
  dialect: 'mysql'
})

//1.首先我們需要將數(shù)據(jù)庫(kù)中的一張表映射成一個(gè)class類
class Product extends Model {}
Product.init({
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,//主鍵
    autoIncrement: true//自動(dòng)增長(zhǎng)
  },
  title: {
    type: DataTypes.STRING,
    allowNotNull: false//是否可以為空
  },
  price: DataTypes.DOUBLE,
  score: DataTypes.DOUBLE
}, {//與數(shù)據(jù)庫(kù)的表進(jìn)行映射的配置
  tableName: 'products',
  createdAt: false,
  updatedAt: false,
  sequelize
});

//存放操作數(shù)據(jù)庫(kù)的代碼
async function queryProducts() {
  //1.查詢數(shù)據(jù)庫(kù)中product表中所有的內(nèi)容
  const result1 = await Product.findAll({
    where: {//在這里配置條件
      price: {
        [Op.gte]: 5000//意思是價(jià)格大于等于5000
        //gte:大于等于,gt:大于,lt:小于,lte:小于等于
      }
    }
  });
  console.log(result1);

  // 2.插入數(shù)據(jù)
  const result2 = await Product.create({
    title: "三星Nova",
    price: 8888,
    score: 5.5
  });
  console.log(result2);

  // 3.更新數(shù)據(jù)
  const result3 = await Product.update({
    price: 3688
  }, {
    where: {
      id: 1
    }
  });
  console.log(result3);
}

queryProducts();//執(zhí)行這個(gè)函數(shù)可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作

Sequelize的一對(duì)多操作

const { Sequelize, DataTypes, Model, Op } = require('sequelize');

const sequelize = new Sequelize("coderhub", 'root', 'Coderwhy888.', {
  host: 'localhost',
  dialect: 'mysql'
});

//數(shù)據(jù)庫(kù)的第一個(gè)表: 主表
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
});

//數(shù)據(jù)庫(kù)的第二個(gè)表:附表
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這個(gè)表,所以product必須放在下面
      key: 'id'
    }
  }
}, {
  tableName: 'products',
  createdAt: false,
  updatedAt: false,
  sequelize
});

// 將兩張表聯(lián)系在一起
Product.belongsTo(Brand, {
  foreignKey: 'brandId'//外鍵
});

async function queryProducts() {
  const result = await Product.findAll({
    include: { //這里是聯(lián)合查詢:意思是包含別的表的信息
      model: Brand
    }
  });
  console.log(result);
}

queryProducts();

Sequelize的多對(duì)多操作

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表:關(guān)系表
class StudentCourse extends Model {}
StudentCourse.init({
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  studentId: {//與Student表建立關(guān)系
    type: DataTypes.INTEGER,
    references: {
      model: Student,
      key: 'id'
    },
    field: 'student_id'
  },
  courseId: {//與Course表建立關(guān)系
    type: DataTypes.INTEGER,
    references: {
      model: Course,
      key: 'id'
    },
    field: 'course_id'
  }
}, {
  tableName: 'students_select_courses',
  createdAt: false,
  updatedAt: false,
  sequelize
});

// 多對(duì)多關(guān)系的聯(lián)系: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: {//所有學(xué)生的選課情況
      model: Course
    }
  });
  console.log(result);
}

queryProducts();

到此這篇關(guān)于Nodejs中koa2連接mysql的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)koa2連接mysql內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Node.js輕量級(jí)Web框架Express4.x使用指南

    淺談Node.js輕量級(jí)Web框架Express4.x使用指南

    本篇文章主要介紹了淺談Node.js輕量級(jí)Web框架Express4.x使用指南,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Node.js搭建小程序后臺(tái)服務(wù)

    Node.js搭建小程序后臺(tái)服務(wù)

    最近在做微信的應(yīng)用號(hào)小程序開(kāi)發(fā),小程序的后臺(tái)數(shù)據(jù)接口需要https安全請(qǐng)求,所以需要我的nodejs服務(wù)器能夠提供https的支持,現(xiàn)在就將整個(gè)https服務(wù)器的搭建過(guò)程說(shuō)一下
    2018-01-01
  • Koa項(xiàng)目搭建過(guò)程詳細(xì)記錄

    Koa項(xiàng)目搭建過(guò)程詳細(xì)記錄

    本篇文章主要介紹了Koa項(xiàng)目搭建過(guò)程詳細(xì)記錄,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Node 使用express-http-proxy 做api網(wǎng)關(guān)的實(shí)現(xiàn)

    Node 使用express-http-proxy 做api網(wǎng)關(guān)的實(shí)現(xiàn)

    這篇文章主要介紹了Node 使用express-http-proxy 做api網(wǎng)關(guān)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Node.js中的HTTP模塊與URL模塊

    Node.js中的HTTP模塊與URL模塊

    這篇文章介紹了Node.js中的HTTP模塊與URL模塊,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Windows7系統(tǒng)下如何安裝nodejs16以上版本

    Windows7系統(tǒng)下如何安裝nodejs16以上版本

    這篇文章主要給大家介紹了關(guān)于Windows7系統(tǒng)下如何安裝nodejs16以上版本的相關(guān)資料,很多時(shí)候node.js的版本存在兼容,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Nodejs+Socket.io實(shí)現(xiàn)通訊實(shí)例代碼

    Nodejs+Socket.io實(shí)現(xiàn)通訊實(shí)例代碼

    本篇文章主要介紹了Nodejs+Socket.io實(shí)現(xiàn)通訊實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • Thinkjs3新手入門(mén)之添加一個(gè)新的頁(yè)面

    Thinkjs3新手入門(mén)之添加一個(gè)新的頁(yè)面

    Thinkjs 是一個(gè)快速、簡(jiǎn)單的基于MVC和面向?qū)ο蟮妮p量級(jí)Node.js開(kāi)發(fā)框架,下面這篇文章主要給大家介紹了關(guān)于Thinkjs3新手入門(mén)之添加一個(gè)新的頁(yè)面的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • Egret引擎開(kāi)發(fā)指南之視覺(jué)編程

    Egret引擎開(kāi)發(fā)指南之視覺(jué)編程

    本部分內(nèi)容詳細(xì)介紹了Egret中關(guān)于視覺(jué)編程顯示對(duì)象的架構(gòu)設(shè)計(jì)以及一些概念,希望對(duì)大家能有所幫助
    2014-09-09
  • Node.js常用工具之util模塊

    Node.js常用工具之util模塊

    util是一個(gè)Node.js核心模塊,提供常用函數(shù)的集合,用于彌補(bǔ)JavaScript的功能的不足,util模塊設(shè)計(jì)的主要目的是為了滿足Node內(nèi)部API的需求。下面這篇文章將詳細(xì)的介紹關(guān)于Node.js常用工具之util模塊的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03

最新評(píng)論