亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

3403771864 / 765人閱讀

  在開發(fā)中,如何將查詢結(jié)果出現(xiàn)?實(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;

1.jpg

    查詢不會(huì)是某一個(gè)條件,是多個(gè)條件一起查詢,出現(xiàn)結(jié)果也并非只有一個(gè),就是多對(duì)多:

  就比如我們查詢學(xué)生信息時(shí),輸入多個(gè)要求,出現(xiàn)多個(gè)符合條件;

  數(shù)組中存放的是課程信息的一個(gè)個(gè)對(duì)象;

  這個(gè)時(shí)候我們要JSON_ARRAYAGGJSON_OBJECT結(jié)合來使用;

2.jpg

  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ù)中寫上:

  connection.end()

  完整代碼:

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

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

  提升:需要發(fā)送給SQL因此要先創(chuàng)建語(yǔ)句模塊,然后MySQL編譯(解析、優(yōu)化、轉(zhuǎn)換)語(yǔ)句模塊,并且存儲(chǔ)

    只是這不是執(zhí)行,現(xiàn)在我們說執(zhí)行,提供實(shí)際的參數(shù)才會(huì)執(zhí)行;就算多次執(zhí)行,也只會(huì)編譯一次,所以性能是更高的;

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

  // 2.執(zhí)行SQL語(yǔ)句: 使用 ?來對(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('連接失?。?#39;,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ì)的方案:

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

  sequelize是我們常用的;

  Sequelize是用于Postgres,MySQL,MariaDB,SQLite和Microsoft SQL Server的基于Node.js 的ORM;

  可以實(shí)現(xiàn)的;功能非常多

  將Sequelize和MySQL共同時(shí)候用,就要先安裝下面兩個(gè):

  mysql2:sequelize在操作mysql時(shí)使用的是mysql2;

  sequelize:使用它來讓對(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();

       請(qǐng)大家多多關(guān)注后續(xù)更多精彩內(nèi)容。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/127788.html

相關(guān)文章

  • koa2 + graphql + typescript + jwt + typeormnodejs

    最近寫了一個(gè)node項(xiàng)目,主要使用到的技術(shù)有: koa2 // nodejs 框架 koa-router // koa路由 graphql // 查詢api typescript // 強(qiáng)類型語(yǔ)言 jwt // 授權(quán) typeorm // typescript的一個(gè)orm mysql2 // 內(nèi)容數(shù)據(jù)庫(kù) mongodb // 日志存儲(chǔ)數(shù)據(jù)庫(kù) redis // 服務(wù)器緩存 項(xiàng)目結(jié)構(gòu):sh...

    Dogee 評(píng)論0 收藏0
  • nodejs如何簡(jiǎn)潔優(yōu)雅訪問mysql數(shù)據(jù)庫(kù)

    摘要:如何簡(jiǎn)潔優(yōu)雅的訪問數(shù)據(jù)庫(kù)一前言誕生以來出現(xiàn)了一大批的框架如等等,前端可以不再依賴后端可以自己控制服務(wù)端的邏輯。今天我們就來說說前端在中如何操作數(shù)據(jù)庫(kù)。 nodejs如何簡(jiǎn)潔優(yōu)雅的訪問mysql數(shù)據(jù)庫(kù)一、前言nodejs誕生以來出現(xiàn)了一大批的web框架如express koa2 egg等等,前端可以不再依賴后端可以自己控制服務(wù)端的邏輯。今天我們就來說說前端在nodejs中如何操作mysq...

    jlanglang 評(píng)論0 收藏0
  • Node.js + Koa2 + MySQL + Vue.js 實(shí)戰(zhàn)開發(fā)一套完整個(gè)人博客項(xiàng)目網(wǎng)站

    摘要:前端打造了前端網(wǎng)站和后臺(tái)管理系統(tǒng)。根目錄都是開發(fā)源代碼,根目錄下的文件夾下都是前端網(wǎng)站項(xiàng)目源代碼,根目錄下的文件夾下都是后臺(tái)管理系統(tǒng)的源代碼。后臺(tái)管理系統(tǒng)使用在根目錄下進(jìn)入項(xiàng)目,安裝包,執(zhí)行命令,啟動(dòng)服務(wù)瀏覽器打開即可以訪問。 showImg(https://segmentfault.com/img/remote/1460000019603918); 這是個(gè)什么的項(xiàng)目? 使用 Node...

    wangxinarhat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<