node 조작 my sql 데이터베이스 인 스 턴 스 상세 설명

13299 단어 nodemysql
본 고의 실례 는 node 가 mysql 데이터 베 이 스 를 조작 하 는 방법 을 설명 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
1.데이터베이스 연결 구축:createConnection(Object)방법
이 방법 은 하나의 대상 을 매개 변수 로 받 아들 입 니 다.이 대상 은 네 개의 자주 사용 하 는 속성 host,user,password,database 가 있 습 니 다.php 에서 데이터 베 이 스 를 연결 하 는 인자 와 같 습 니 다.속성 목록 은 다음 과 같 습 니 다:
host
데이터베이스 가 있 는 호스트 이름 을 연결 합 니 다.(기본 값:localhost)
port
포트 연결.(기본 값:3306)
localAddress
TCP 연결 에 사용 할 IP 주소 입 니 다.(선택 가능)
socketPath
유 닉 스 필드 로 연 결 된 경로 입 니 다.host 와 port 를 사용 할 때 이 인 자 는 무 시 됩 니 다.
user
MySQL 사용자 의 사용자 이름 입 니 다.
password
MySQL 사용자 의 비밀번호.
database
연 결 된 데이터베이스 이름(선택 가능).
charset
연 결 된 문자 집합 입 니 다.(기본 값:'UTF 8 'GENERAL_CI.이 값 을 대문자 로 설정 합 니 다!)
timezone
로 컬 시간 대 를 저장 합 니 다.(기본 값:'local')
stringifyObjects
대상 을 정렬 할 지 여부 입 니 다.See issue\#501.(기본 값:false)
insecureAuth
오래된 인증 방법 을 데이터베이스 인 스 턴 스 에 연결 할 수 있 는 지 여부 입 니 다.(기본 값:false)
typeCast
column 값 을 로 컬 JavaScript 형식 열 값 으로 변환 할 지 확인 합 니 다.(기본 값:true)
queryFormat
사용자 정의 검색 어 포맷 함수.
supportBigNumbers
데이터베이스 에서 큰 숫자(긴 정형 과 소수 포함)를 처리 할 때 사용 해 야 합 니 다(기본 값:false).
bigNumberStrings
슈퍼 portBigNumbers 와 bigNumberStrings 를 사용 하고 문자열 로 되 돌려 주도 록 강제 합 니 다(기본 값:false).
dateStrings
날짜 형식(TIMESTAMP,DATETIME,DATE)을 자 바스 크 립 트 날짜 대상 이 아 닌 문자열 로 되 돌려 줍 니 다.(기본 값:false)
debug
디 버 깅 을 시작 할 지 여부 입 니 다.(기본 값:false)
multipleStatements
한 query 에 여러 개의 검색 어 를 전달 할 수 있 는 지 여부 입 니 다.(Default:false)
flags
링크 표지.
데이터베이스 에 문자열 로 연결 할 수도 있 습 니 다.예 를 들 어:

var connection = mysql.createConnection('mysql://user:pass@host/db?debug=true&charset=BIG5_CHINESE_CI&timezone=-0700');

2.데이터베이스 연결 종료end()destroy()end()는 리 셋 함 수 를 받 아들 이 고 query 가 끝 난 후에 야 실 행 됩 니 다.query 가 잘못 되면 링크 를 종료 하고 오 류 는 리 셋 함수 에 전 달 됩 니 다.
destroy()는 데이터베이스 연결 을 즉시 종료 합 니 다.query 가 완성 되 지 않 았 더 라 도 이후 의 리 셋 함수 가 실행 되 지 않 습 니 다.
3.연결 풀 만 들 기createPool(Object)  Object 와 createConnection 매개 변 수 는 같 습 니 다.
connection 이 벤트 를 감청 하고 session 값 을 설정 할 수 있 습 니 다.

pool.on('connection', function(connection) {
 connection.query('SET SESSION auto_increment_increment=1')
});
connection.release()연결 풀 에 링크 를 놓 습 니 다.연결 을 닫 고 삭제 하려 면 connection.destroy()를 사용 해 야 합 니 다.
pool 은 connection 과 같은 인 자 를 받 아들 이 는 것 외 에 몇 개의 확장 인 자 를 받 아들 입 니 다.
createConnection
링크 를 만 드 는 함수 입 니 다.(Default:mysql.createConnection)
waitForConnections
연결 풀 이나 링크 수가 최대 값 으로 연결 되 지 않 았 을 때 pool 의 행동 을 결정 합 니 다.true 일 때 링크 는 대기 열 에 넣 어 호출 할 수 있 고 false 일 때 즉시 error 로 돌아 갑 니 다.(Default:true)
connectionLimit
최대 연결 수 입 니 다.(기본 값:10)
queueLimit
연결 탱크 에서 연결 요청 한 열의 최대 길 이 는 이 길 이 를 초과 하면 오류 가 발생 합 니 다.값 이 0 일 때 제한 이 없습니다.(Default:0)
4.연결 탱크 클 러 스 터
다른 host 링크 허용

// create
var poolCluster = mysql.createPoolCluster();
poolCluster.add(config); // anonymous group
poolCluster.add('MASTER', masterConfig);
poolCluster.add('SLAVE1', slave1Config);
poolCluster.add('SLAVE2', slave2Config);
// Target Group : ALL(anonymous, MASTER, SLAVE1-2), Selector : round-robin(default)
poolCluster.getConnection(function (err, connection) {});
// Target Group : MASTER, Selector : round-robin
poolCluster.getConnection('MASTER', function (err, connection) {});
// Target Group : SLAVE1-2, Selector : order
// If can't connect to SLAVE1, return SLAVE2. (remove SLAVE1 in the cluster)
poolCluster.on('remove', function (nodeId) {
   console.log('REMOVED NODE : ' + nodeId); // nodeId = SLAVE1
});
poolCluster.getConnection('SLAVE*', 'ORDER', function (err, connection) {});
// of namespace : of(pattern, selector)
poolCluster.of('*').getConnection(function (err, connection) {});
var pool = poolCluster.of('SLAVE*', 'RANDOM');
pool.getConnection(function (err, connection) {});
pool.getConnection(function (err, connection) {});
// destroy
poolCluster.end();

클 러 스 터 를 연결 하 는 선택 가능 한 매개 변수
canRetry
값 이 true 일 때 연결 이 실 패 했 을 때 다시 시도 할 수 있 습 니 다(Default:true)
removeNodeErrorCount
연결 에 실 패 했 을 때 errorCount 값 이 증가 합 니 다.errorCount 값 이 removeNodeErrorCount 보다 크 면 PoolCluster 에서 노드 를 삭제 합 니 다.(Default:5)
defaultSelector
기본 선택 기 입 니 다.(기본 값:RR)
RR
순환.(라운드-로 빈)
RANDOM
무 작위 함수 로 노드 를 선택 하 십시오.
ORDER
첫 번 째 사용 가능 한 노드 를 무조건 선택 하 십시오.
5.사용자 전환/연결 상태 변경
Mysql 은 연결 이 끊 긴 상태 에서 사용 자 를 전환 할 수 있 습 니 다.

connection.changeUser({user : 'john'}, function(err) {
 if (err) throw err;
});

매개 변수
user
새로운 사용자(기본 값 은 이전 사용자).
password
새 사용자 의 새 비밀번호(기본 값 은 이전 비밀번호).
charset
새 문자 집합(기본 값 은 이전 것).
database
새 데이터베이스 이름(기본 값 은 이전 것).
6.서버 연결 차단 처리

var db_config = {
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'example'
};
var connection;
function handleDisconnect() {
 connection = mysql.createConnection(db_config); // Recreate the connection, since
                         // the old one cannot be reused.
 connection.connect(function(err) {       // The server is either down
  if(err) {                   // or restarting (takes a while sometimes).
   console.log('error when connecting to db:', err);
   setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
  }                   // to avoid a hot loop, and to allow our node script to
 });                   // process asynchronous requests in the meantime.
                     // If you're also serving http, display a 503 error.
 connection.on('error', function(err) {
  console.log('db error', err);
  if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
   handleDisconnect();             // lost due to either server restart, or a
  } else {                   // connnection idle timeout (the wait_timeout
   throw err;                 // server variable configures this)
  }
 });
}
handleDisconnect();

7.전의 조회 값
SQL 주입 공격 을 피하 기 위해 서 는 사용자 가 제출 한 데 이 터 를 전의 해 야 합 니 다.사용 가능connection.escape()또는pool.escape()예 를 들 면:

var userId = 'some user provided value';
var sql  = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function(err, results) {
   // ...
});

아니면 사용?자리 차지 문자 로 삼다

connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
   // ...
});

유형 별 값 변환 결과
Numbers 불변
Booleans 문자열'true'/'false'로 변환
Date 대상 을 문자열'YYYY-mm-dd HH:ii:ss'로 변환
Buffers 를 6 진수 문자열 로 변환
Strings 불변
Arrays=>['a','b']를'a','b'로 변환 합 니 다.
내장 배열[[['a','b'],['c','d']를('a','b')로 변환 합 니 다.('c','d')
Objects 를 key='val'pairs 로 변환 합 니 다.끼 워 넣 은 대상 을 문자열 로 변환 합 니 다.
undefined / null ===> NULL
NaN/Infinity 는 변 하지 않 습 니 다.MySQL 은 이 값 을 지원 하지 않 습 니 다.  도구 지원 이 없 으 면 이 값 을 삽입 하면 오류 가 발생 할 수 있 습 니 다.
변환 실례:

var post = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
   // Neat!
});
console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

수 동 변환

var query = "SELECT * FROM posts WHERE title=" + mysql.escape("Hello MySQL");
console.log(query); // SELECT * FROM posts WHERE title='Hello MySQL'

8.검색 식별 자 변환
SQL 식별 자(데이터베이스 이름,표 이름,열 이름)를 신뢰 할 수 없다 면 변환 방법 mysql.escapeId(identifier)를 사용 할 수 있 습 니 다.

var sorter = 'date';
var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId(sorter);
console.log(query); // SELECT * FROM posts ORDER BY `date`

여러 개의 전의 지원

var sorter = 'date';
var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId('posts.' + sorter);
console.log(query); // SELECT * FROM posts ORDER BY `posts`.`date`

사용 가능??식별 자로 서 의 자리 표시 자

var userId = 1;
var columns = ['username', 'email'];
var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) {
   // ...
});
console.log(query.sql); // SELECT `username`, `email` FROM `users` WHERE id = 1

9.조회 준비
my sql.format 을 사용 하여 검색 어 를 준비 할 수 있 습 니 다.이 함 수 는 자동 으로 적당 한 방법 전의 파 라 메 터 를 선택 합 니 다.

var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts);

10.사용자 정의 포맷 함수

connection.config.queryFormat = function (query, values) {
   if (!values) return query;
   return query.replace(/\:(\w+)/g, function (txt, key) {
    if (values.hasOwnProperty(key)) {
     return this.escape(values[key]);
    }
    return txt;
   }.bind(this));
};
connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });

11.줄 삽입 id 가 져 오기
홈 키 를 사용 할 때 삽입 줄 id 를 가 져 옵 니 다.예 를 들 어:

connection.query('INSERT INTO posts SET ?', {title: 'test'}, function(err, result) {
   if (err) throw err;
   console.log(result.insertId);
  });

12.흐름 처리
때때로 당신 은 대량의 줄 을 선택 하고 데이터 가 도착 할 때 그들 을 처리 하 기 를 원 합 니 다.당신 은 이 방법 을 사용 할 수 있 습 니 다.

var query = connection.query('SELECT * FROM posts');
  query
   .on('error', function(err) {
    // Handle error, an 'end' event will be emitted after this as well
   })
   .on('fields', function(fields) {
    // the field packets for the rows to follow
   })
   .on('result', function(row) {
    // Pausing the connnection is useful if your processing involves I/O
    connection.pause();
    processRow(row, function() {
     connection.resume();
    });
   })
   .on('end', function() {
    // all rows have been received
   });

13.혼합 검색 어(다 중 검색 어)
혼합 조 회 는 SQL 에 공격 을 주입 하기 쉽 기 때문에 기본적으로 허용 되 지 않 습 니 다.사용 할 수 있 습 니 다:

var connection = mysql.createConnection({multipleStatements: true});

이 기능 을 켜 세 요.
혼합 조회 실례:

connection.query('SELECT 1; SELECT 2', function(err, results) {
   if (err) throw err;
   // `results` is an array with one element for every statement in the query:
   console.log(results[0]); // [{1: 1}]
   console.log(results[1]); // [{2: 2}]
  });

스 트림 처리 혼합 조회 결 과 를 사용 할 수 있 습 니 다:

var query = connection.query('SELECT 1; SELECT 2');
  query
   .on('fields', function(fields, index) {
    // the fields for the result rows that follow
   })
   .on('result', function(row, index) {
    // index refers to the statement this result belongs to (starts at 0)
   });

검색 어 중 하나 가 잘못 되면 Error 대상 은 err.index 가 잘못된 문 구 를 표시 하 는 id 를 포함 하고 전체 검색 도 종 료 됩 니 다.
혼합 조회 결과 의 흐름 처리 방식 은 실험 적 이 고 불안정 하 다.
14.사무 처리
connection 단계 의 간단 한 사무 처리

connection.beginTransaction(function(err) {
   if (err) { throw err; }
   connection.query('INSERT INTO posts SET title=?', title, function(err, result) {
    if (err) {
     connection.rollback(function() {
      throw err;
     });
    }
    var log = 'Post ' + result.insertId + ' added';
    connection.query('INSERT INTO log SET data=?', log, function(err, result) {
     if (err) {
      connection.rollback(function() {
       throw err;
      });
     }
     connection.commit(function(err) {
      if (err) {
       connection.rollback(function() {
        throw err;
       });
      }
      console.log('success!');
     });
    });
   });
  });

15.오류 처리

err.code = string
err.fatal => boolean

더 자세 한 설명 은 다음 을 보십시오.https://github.com/felixge/node-mysql
본 논문 에서 말 한 것 이 여러분 의 nodejs 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기