> 데이터 베이스 > MySQL 튜토리얼 > Nodejs에서 koa2를 mysql에 연결하는 방법

Nodejs에서 koa2를 mysql에 연결하는 방법

WBOY
풀어 주다: 2023-06-01 12:40:06
앞으로
1310명이 탐색했습니다.

쿼리 결과를 개체 또는 배열로 변환

실제 개발에서는 일부 쿼리 결과를 실제로 개체에 넣어야 합니다

JSON_OBJECT: ()는 키-값 형식입니다

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;
로그인 후 복사

Nodejs에서 koa2를 mysql에 연결하는 방법

대다 관계에서 쿼리하려는 것은 배열입니다.

  • 예를 들어, 학생의 여러 강좌 정보는 배열에 배치되어야 합니다.

  • 배열은 강좌 정보 개체를 하나씩 저장합니다.

    이번에는
  • 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 사용Nodejs에서 koa2를 mysql에 연결하는 방법

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 문(준비된 문)

성능 향상: 생성된 문 모듈을 MySQL로 보낸 다음 MySQL 컴파일(파싱) , 최적화, 변환) 명령문 모듈을 저장하고 실행하지는 않습니다. 나중에 실제로 실행하면 실행하기 전에 실제 매개 변수를 제공하므로 여러 번 실행하더라도 한 번만 컴파일됩니다. 성능이 더 높습니다.

강조: 명령문이 다시 실행되면 LRU(Least Recent Used) 캐시에서 가져오므로 성능 향상을 위해 명령문을 컴파일하는 시간이 생략됩니다.

// 2.执行SQL语句: 使用 ?来对参数进行占位
const statement = `
  SELECT * FROM products WHERE price > ? AND score > ?;
`
connection.execute(statement, [6000, 7], (err, results) => {
  console.log(results);
});
로그인 후 복사

Connection Pools
?앞서 연결을 생성했지만 요청이 여러 개인 경우 연결이 점유될 가능성이 높으므로 매번 새 연결을 생성해야 합니까?

실제로 mysql2는 연결 풀을 제공합니다.

    연결 풀은 필요할 때 자동으로 연결을 생성할 수 있으며 생성된 연결은 삭제되지 않고 계속해서 사용할 수 있습니다.
  • 연결 풀을 생성할 때 최대 생성 수인 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);
});
로그인 후 복사
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

Object Relational Mapping (ORM)

: 프로그래밍 솔루션입니다:

효과면에서 프로그래밍 언어에서 가상 개체 데이터베이스를 사용하는 것과 같은 효과를 제공합니다 ;

  • Sequelize는 일반적으로 Sequelize를 사용하는 Node의 ORM입니다.

  • Sequelize는 Postgres, MySQL, MariaDB, SQLite 및 Microsoft SQL Server용 Node.js 기반 ORM입니다.

    매우 많은 기능을 지원합니다.
  • MySQL과 함께 Sequelize를 사용하려면 먼저 두 가지를 설치해야 합니다.

  • mysql2: Sequelize는 mysql을 실행할 때 mysql2를 사용합니다.

sequelize: 개체를 테이블에 매핑할 수 있습니다.

    npm install sequelize mysql2
    로그인 후 복사
  • Sequelize 사용

    데이터베이스에 대한 Sequelize 연결:
  • 1단계: Sequelize 개체를 생성하고 데이터베이스, 사용자 이름, 비밀번호, 데이터베이스 유형 및 호스트 주소를 지정합니다.

    2단계: 대기; 연결에 성공했습니다.
  • 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 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에 연결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿