수색…


소개

이 항목에서는 MYSQL 데이터베이스 관리 도구를 사용하여 Node.js와 통합하는 방법을 학습합니다. nodejs 프로그램과 스크립트를 사용하여 mysql에있는 데이터를 연결하고 상호 작용하는 다양한 방법을 배우게된다.

매개 변수로 연결 개체 쿼리

SQL에서 사용자 생성 컨텐츠를 사용하려면 매개 변수로 완료하십시오. 예를 들어 aminadav 라는 이름으로 사용자를 검색 aminadav 다음을 수행해야합니다.

var username = 'aminadav';
var querystring = 'SELECT name, email from users where name = ?'; 
connection.query(querystring, [username], function(err, rows, fields) {
  if (err) throw err;
  if (rows.length) {
    rows.forEach(function(row) {
      console.log(row.name, 'email address is', row.email);
    });
  } else {
    console.log('There were no results.');
  }
});

연결 풀 사용

에이. 동시에 여러 쿼리 실행

MySQL 연결의 모든 쿼리는 차례로 수행됩니다. 즉, 10 개의 쿼리를 수행하고 각 쿼리에 2 초가 걸리면 전체 실행을 완료하는 데 20 초가 걸립니다. 해결 방법은 10 개의 연결을 만들고 각 쿼리를 다른 연결로 실행하는 것입니다. 연결 풀을 사용하여 자동으로 수행 할 수 있습니다.

var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bobby',
  password        : 'pass',
  database        : 'schema'
});

for(var i=0;i<10;i++){
  pool.query('SELECT ` as example', function(err, rows, fields) {
    if (err) throw err;
    console.log(rows[0].example); //Show 1
  });
 }

병렬로 10 개의 쿼리를 모두 실행합니다.

pool 을 사용할 때 더 이상 연결이 필요하지 않습니다. 풀을 직접 쿼리 할 수 ​​있습니다. MySQL 모듈은 다음 무료 연결을 검색하여 쿼리를 실행합니다.

비. 여러 데이터베이스가 호스팅되어있는 데이터베이스 서버에서 멀티 테넌시를 달성합니다.

요즘 멀티 테넌시는 엔터프라이즈 애플리케이션의 일반적인 요구 사항이며 데이터베이스 서버의 각 데이터베이스에 대한 연결 풀을 만드는 것은 권장되지 않습니다. 그래서 우리가 대신 할 수있는 것은 데이터베이스 서버와의 연결 풀을 생성 한 다음 필요에 따라 데이터베이스 서버에서 호스팅되는 데이터베이스간에 전환하는 것입니다.

우리 애플리케이션이 데이터베이스 서버에서 호스팅되는 각 회사에 대해 서로 다른 데이터베이스를 가지고 있다고 가정합니다. 사용자가 애플리케이션에 접근하면 해당 회사 데이터베이스에 연결됩니다. 다음은이를 수행하는 방법에 대한 예제입니다.

var pool  = mysql.createPool({
      connectionLimit : 10,
      host            : 'example.org',
      user            : 'bobby',
      password        : 'pass'
    });
    
pool.getConnection(function(err, connection){
    if(err){
        return cb(err);
    }
    connection.changeUser({database : "firm1"});
    connection.query("SELECT * from history", function(err, data){
        connection.release();
        cb(err, data);
    });
});

내가 그 예를 드러 낼 수 있도록하자.

풀 구성을 정의 할 때 데이터베이스 이름을 지정하지 않았지만 데이터베이스 서버 만 제공했습니다.

{
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bobby',
  password        : 'pass'
}

그래서 우리는 특정 데이터베이스를 데이터베이스 서버에서 사용하고자 할 때 다음과 같이 데이터베이스 연결을 요청합니다 :

    connection.changeUser({database : "firm1"});

공식 문서는 여기에서 참조 할 수 있습니다.

MySQL에 연결

MySQL에 연결하는 가장 쉬운 방법 중 하나는 mysql 모듈을 사용하는 것이다. 이 모듈은 Node.js 앱과 MySQL 서버 간의 연결을 처리합니다. 다른 모듈과 마찬가지로 설치할 수 있습니다.

npm install --save mysql

이제 당신은 나중에 질의 할 수있는 mysql 연결을 만들어야한다.

const mysql      = require('mysql');
const connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'database_schema'
});

connection.connect();

// Execute some query statements
// I.e. SELECT * FROM FOO

connection.end();

다음 예제에서는 connection 개체를 쿼리하는 방법을 배웁니다.

매개 변수없이 연결 개체 쿼리

쿼리를 문자열로 보내고 응답 콜백에서 응답을받습니다. 콜백은 error , rows 및 필드의 배열을 제공합니다. 각 행은 반환 된 테이블의 모든 열을 포함합니다. 다음 설명을위한 스 니펫입니다.

connection.query('SELECT name,email from users', function(err, rows, fields) {
  if (err) throw err;

  console.log('There are:', rows.length,' users');
  console.log('First user name is:',rows[0].name)
});

풀에서 단일 연결로 여러 쿼리 실행

MySQL 연결 풀을 설정했지만 순차적으로 실행하려는 쿼리가 몇 가지있을 수 있습니다.

SELECT 1;
SELECT 2;

다른 곳 에서 있는 것처럼 pool.query 를 사용하여 실행할 수 있습니다 . 그러나 풀에 하나의 무료 연결 만있는 경우 두 번째 쿼리를 실행하기 전에 연결이 가능할 때까지 기다려야합니다.

그러나 풀에서 활성 연결을 유지하고 pool.getConnection 사용하여 단일 연결을 사용하여 원하는만큼의 쿼리를 실행할 수 있습니다.

pool.getConnection(function (err, conn) {
  if (err) return callback(err);

  conn.query('SELECT 1 AS seq', function (err, rows) {
    if (err) throw err;

    conn.query('SELECT 2 AS seq', function (err, rows) {
      if (err) throw err;

      conn.release();
      callback();
    });
  });
});

참고 : 연결을 release 해야합니다. 그렇지 않으면 나머지 풀에 사용할 수있는 MySQL 연결이 하나 줄어 듭니다.

MySQL 연결 풀링에 대한 더 많은 정보 는 MySQL 문서를 확인하십시오 .

오류가 발생하면 쿼리를 반환합니다.

당신은 당신에 실행 된 쿼리에 첨부 할 수 있습니다 err 오류가 발생하면 개체를 :

var q = mysql.query('SELECT `name` FROM `pokedex` WHERE `id` = ?', [ 25 ], function (err, result) {
  if (err) {
    // Table 'test.pokedex' doesn't exist
    err.query = q.sql; // SELECT `name` FROM `pokedex` WHERE `id` = 25
    callback(err);
  }
  else {
    callback(null, result);
  }
});

연결 풀 내보내기

// db.js

const mysql = require('mysql');

const pool = mysql.createPool({
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bob',
  password        : 'secret',
  database        : 'my_db'
});

module.export = {
  getConnection: (callback) => {
    return pool.getConnection(callback);
  } 
}
// app.js

const db = require('./db');

db.getConnection((err, conn) => {
  conn.query('SELECT something from sometable', (error, results, fields) => {
    // get the results
    conn.release();
  });
});


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow