npm install mysql
コネクションでもエラー処理とかしたいならこんな感じ
connection.connect(function(err) { if (err) { console.error('error connecting: ' + err.stack); return; } console.log('connected as id ' + connection.threadId); });resultは結果。fieldsは各フィールドの詳細。filedsの中身はこんな感じ
[{"catalog":"def","db":"hoge","table":"books","orgTable":"books","name":"ID","orgName":"ID","charsetNr":63,"length":11,"type":3,"flags":16899,"decimals":0,"zeroFill":false,"protocol41":true},・・・・第一引数のSQL文中にクエスチョンマークを指定。第二引数に配列を指定してあげると、?に入る。この時第二引数で渡した値はエスケープされる。第一引数で渡した文字列はエスケープされないので値はプレースホルダで渡すほうがよさそう
もし自前でエスケープするなら、下記が使えるmysql.escape(), connection.escape() または pool.escape()
jQueryの$.ajaxみたいなもんですね。こっちのほうが見た目がすっきりしてます。
フィールド名に使う場合、??を使います
var userId = 1; var columns = ['username', 'email']; var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) { // ... });これをSQL文で書くとこうなる
SELECT username,email FROM users WHERE id = 1;プリペアードステートメントみたいな感じですかね?
var sql = "SELECT * FROM ?? WHERE ?? = ?"; var inserts = ['users', 'id', userId]; sql = mysql.format(sql, inserts);これもすっきり書けていいですね。
うまく説明できないですが、上のコードの通りです。
複数挿入した場合は一番最後のIDが返ります。
こっちはUpdateの際に使う
connection.query('UPDATE posts SET ...', function (err, result) { if (err) throw err; console.log('changed ' + result.changedRows + ' rows'); })affectedRowsとの違いは、changedRowsは変更がなかった行は含まれない点affectedRows ・・・Updateの対象になったレコード数cahngedRows ・・・実際に値が更新されたレコード数つまりはこういうことです
こんなテーブルがあったとして table test ID NAME 1 HOGE 2 FUGA 3 HOGE 4 FUGA これを実行すると update test set NAME = 'FUGA'; affectedRows = 4 changedRows = 2 となります。なんて訳せばよいの?こんな書き方もできます。
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 //pause()を実行すると、以降resultイベントが発生しない connection.pause(); processRow(row, function() { connection.resume(); }); }) .on('end', function() { // all rows have been received });このようにresultsが配列で返ってくるStreamで書くなら
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) });ここでも?が使えるのかな?試してない。
よくわからんけど、フィールド名が重複するような場合には、nestTablesを有効にしておくと、テーブル名でネストして結果を返してくれるよ
var options = {sql: '...', nestTables: true}; connection.query(options, function(err, results) { /* results will be an array like this now: [{ table1: { fieldA: '...', fieldB: '...', }, table2: { fieldA: '...', fieldB: '...', }, }, ...] */ });またはフィールド名にテーブル名をつけてマージすることもできるよ
var options = {sql: '...', nestTables: '_'}; connection.query(options, function(err, results) { /* results will be an array like this now: [{ table1_fieldA: '...', table1_fieldB: '...', table2_fieldA: '...', table2_fieldB: '...', }, ...] */ });コネクションレベルで使えます
//トランザクション開始 connection.beginTransaction(function(err) { if (err) { throw err; } connection.query('INSERT INTO posts SET title=?', title, function(err, result) { if (err) { //insertに失敗したら戻す connection.rollback(function() { throw err; }); } var log = 'Post ' + result.insertId + ' added'; connection.query('INSERT INTO log SET data=?', log, function(err, result) { if (err) { //insertに失敗したら戻す connection.rollback(function() { throw err; }); } //コミットする connection.commit(function(err) { if (err) { connection.rollback(function() { throw err; }); } console.log('success!'); }); }); }); });connection.destroy()
コネクションが使われたゾ
pool.on('connection', function (connection) { connection.query('SET SESSION auto_increment_increment=1') });戻ってきたぞ
pool.on('enqueue', function () { console.log('Waiting for available connection slot'); }); //endしたあとにpool.getConnectionとかしても、もう何もしてやんないから。プール(各コネクション)に名前を付けてあげましょうってことかな?
// create var poolCluster = mysql.createPoolCluster(); // add configurations poolCluster.add(config); // anonymous group poolCluster.add('MASTER', masterConfig); poolCluster.add('SLAVE1', slave1Config); poolCluster.add('SLAVE2', slave2Config); // remove configurations poolCluster.remove('SLAVE2'); // By nodeId poolCluster.remove('SLAVE*'); // By target group : SLAVE1-2 // 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) {}); // close all connections poolCluster.end(function (err) { // all connections in the pool cluster have ended });err.codeには下記の種類があります。MySQL serverのエラー (たとえば 'ER_ACCESS_DENIED_ERROR')node.jsのエラー (たとえば 'ECONNREFUSED')内部エラー (たとえば 'PROTOCOL_CONNECTION_LOST')
var connection = require('mysql').createConnection({ port: 84943, // わざと間違ったポートを指定してみる }); connection.connect(function(err) { console.log(err.code); // 'ECONNREFUSED' console.log(err.fatal); // true }); connection.query('SELECT 1', function(err) { console.log(err.code); // 'ECONNREFUSED' console.log(err.fatal); // true });エラーはほかの処理には影響しない(含まれない)。たとえば下記のような場合
//存在しないDBに接続 connection.query('USE name_of_db_that_does_not_exist', function(err, rows) { console.log(err.code); // 'ER_BAD_DB_ERRORが発生' }); //その後下記クエリを実行 connection.query('SELECT 1', function(err, rows) { console.log(err); // null ここにエラーは含まれない console.log(rows.length); // 1 });こんな風にエラー処理することもできます。
connection.on('error', function(err) { console.log(err.code); // 'ER_BAD_DB_ERROR' }); connection.query('USE name_of_db_that_does_not_exist');デフォルトで、JavaScriptの型に下記のように自動変換されます。(一部未翻訳スミマセン)
TINYINTSMALLINTINTMEDIUMINTYEARFLOATDOUBLE
TIMESTAMPDATEDATETIME
TINYBLOBMEDIUMBLOBLONGBLOBBLOBBINARYVARBINARYBIT (last byte will be filled with 0 bits as necessary)
Note text in the binary character set is returned as Buffer, rather than a string.
CHARVARCHARTINYTEXTMEDIUMTEXTLONGTEXTTEXTENUMSETDECIMAL (may exceed float precision)BIGINT (may exceed float precision)TIME (could be mapped to Date, but what date would be set?)GEOMETRY (never used those, get in touch if you do)It is not recommended (and may go away / change in the future) to disable type casting, but you can currently do so on either the connection:
おすすめしないけど、型変換をoffにできます。
//コネクションレベルでoff var connection = require('mysql').createConnection({typeCast: false}); //クエリレベルでoff var options = {sql: '...', typeCast: false}; var query = connection.query(options, function(err, results) { });また、自分で型変換を定義できます。
connection.query({ sql: '...', typeCast: function (field, next) { if (field.type == 'TINY' && field.length == 1) { return (field.string() == '1'); // 1 = true, 0 = false } return next(); } });https://github.com/felixge/node-mysql
转载于:https://www.cnblogs.com/c-x-a/p/5462037.html