Introduction
I had to develop a small automation to query some old mysql data, with given product names. The mysql database had a table name products, and I was intersted in three fields:
name, created_at, updated_atI had a text file with product names in one line, and had to query the two dates from the table. I wrote a small nodejs automation for this.
Expected Output
The expected ourput I wanted is a csv file:
ProductName, created_at, updated_atNpm Modules Used
-
MySql The core module which has apis to connect to mysql. All the apis are callback based, not in promise form.
-
es6-promisify This module is used to convert mysql module’s apis into promised form. This module is very handy.
-
async I want to perform async loop with promises in between.
-
momentjs I wanted to format some dates from mysql table.
Code
I wrote a mysql client class to query this.
const mysql = require('mysql');
const {promisify} = require("es6-promisify");
const async = require('async');
const moment = require('moment');
class Client {
init(config) {
console.log('Connecting to mysql...');
this.__connection = mysql.createConnection({
host : config.host,
user : config.user,
password : config.password,
database : config.database
});
this.__connection.connect();
this.__query = promisify(this.__connection.query.bind(this.__connection));
console.log('connected');
return Promise.resolve();
}
testQuery(lines) {
return new Promise((resolve, reject) => {
async.eachLimit(lines, 1, (line, callback) => {
if (line) {
const query = `select * from products where name like \'%${line.trim()}%\'`;
return this.__query(query)
.then((res) => {
if (res && res.length > 0) {
const cd = moment(res[0].created_at).format('DD-MM-YYYY');
const ud = moment(res[0].updated_at).format('DD-MM-YYYY');
console.log(`${line.trim()},${cd},${ud}`);
}
else {
console.error('ERROR', line.trim());
}
callback();
})
.catch((err) => {
callback(err);
});
}
else {
callback();
}
}, function (err) {
if (err) {
reject(err);
} else {
console.log('Done');
resolve();
}
});
});
}
}
module.exports = new Client();
And, a main app file
// my above client class
const client = require('./src/product_mysql/client');
const fs = require('fs');
const async = require('async');
// file from where to read product names
const data = fs.readFileSync('<path>/prod_names.txt', 'UTF-8');
const lines = data.split(/\r?\n/);
const config = {
host : 'localhost',
user : 'xxxxx',
password : 'xxxxxxxx',
database : 'xxxxxx'
};
return client.init(config)
.then(() => {
return client.testQuery(lines);
})
.then( () => {
console.log('Success');
})
.catch(err => {
console.error(err);
});Note: For logging purpose, I just used simple console.log statements. I should have winston module. But, this was a small automation and I don’t need that much effort.
Running the Program and Output
To run program
node appOutput
Android-DEXI Framework,03-11-2016,12-03-2018
Mobile-Files,03-11-2016,12-03-2018
Sekhmet,03-11-2016,12-03-2018
Sample,03-11-2016,12-03-2018
Codex and Build 2 Ship,03-11-2016,12-03-2018
Test Touch,03-11-2016,12-03-2018Let me know if you have any query.













