نوشتن کوئری Mysql در Node.js


تقریبا یک سال پیش یک پروژه میخواستم روی الکترون انجام بدم که نیاز داشتم به کوئری زدن mysql . به این دلیل که پایگاه داده از قبل درست شده بود و نمیشد کاریش کرد .

منم روی node.js با mongoos کار میکردم و اتفاق نیفتاده بود که برم روی mysql برای node.js .

خیلی نگشتم . داخل npm خیلی راحت پیداش کردم .

این صفحه npm برای mysql :

https://www.npmjs.com/package/mysql

خوب حالا بریم سر اصل مطلب .

اینکه چجوری از این پکیج استفاده کنیم . اول از همه نصب رو انجام بدیم :

npm install mysql

خیلی راحته و برای استفاده داخل node.js باید require کنیم .

var mysql      = require('mysql');

حالا دسترسی کامل به mysql داریم و با متغیر mysql میتونیم به آبجکت هایی که میخوایم برسیم .

اول از همه باید کانکشن رو ایجاد کنیم .

var connection = mysql.createConnection({  host     : 'localhost',

user     : 'nima_nodejs',
 password : 'something',
   database : 'nodejs'
   }); 
   connection.connect(function(err) {
 if (err) throw err;
  console.log("Connected! Yeahhhh");
});

خوب حالا اگر فایل رو اجرا کنیم و تنظیمات رو درست ست کرده باشیم ، داخل ترمینال پیغام connected! Yeahh رو میگیریم .

نوبت میرسه به نوشتن کوئری ها . مثال بالا رو تغییر میدم :‌

var connection = mysql.createConnection({
 host     : 'localhost',
 user     : 'me',
  password : 'secret',
   database : 'my_db
   });
   connection.connect();   //Now Connected
   connection.query('SELECT * FROM users where user_id=1', function (error, users, fields) {
     if (error) throw error;
     console.log('We find user : ', users[0].name); //now it will print name of users
     });
     connection.end();

داخل مثال بالا ما یک سلکت ساده زدیم با یک شرط که کاربر با آی دی 1 رو بگیریم و نتیجه رو ریختیم داخل users تا بتونیم ازش استفاده کنیم .

نوشتن کوئری با پرفونس بالاتر با استفاده از Connection pool

https://en.wikipedia.org/wiki/Connection_pool
این مورد شاید خیلی نیاز نباشه اما جالب و خاصه

اول از همه بگم که pool یا استخر چیه .

استخر کانکشن ها ، به این معنیه که ما چندین کانکشن ایجاد میکنیم و در شرایط داینامیک برای کلاستر کردم ، ازشون استفاده میکنیم .

این مورد میتونه برای ارتباطات روی ریکوئست های خیلی بالا کمک کنه بهتون تا کاربر کوئری kill نشده نداشته باشه .

وقتی که شما میخواین یک کانکشن رو تغییر بدید به صورت داینامیک ، باید کانکشن قبلی رو حتما kill کنین ، در غیر این صورت خیلی به سرور بار اضافه میکنه . دقیقا کار استخر کانکشن همینه که شما بتونین این کلاسترینگ رو با مدیریت کمتری انجام بدید . مثال زیرو ببینید :‌

var mysql = require('mysql');
var pool  = mysql.createPool({
 connectionLimit : 10,
 host            : 'nima_nodejs.org',
 user            : 'nima_nodejs',
 password        : 'something',
 database        : 'node_js'
 });
 pool.query('SELECT * FROM users', function (error, users, fields) {
  if (error) throw error;
  console.log('User: ', users[0].name);
  });

مقدار connectionLimit به این معنیه که شما چه تعداد کانکشن میخواین بسازین که داخل استخر زنده بمونن . مقدار پیشفرض هم روی 10 هست .

این مفهوم رو که خوب باهاش کار کنین میتونین با قابلیت poolCluster به صورت خیلی زیبا و راحت ، کلاسترینگ رو انجام بدید روی دیتابیس .

اما باز هم میگم که این کار ها برای داکر قابل اجرا نیست و حتما باید mysql خارج کانتینر داکر باشه .

نحوه جلوگیری از Sql Injection :

خوب همه زبان هایی که با sql کار میکنن ، escape کردن رو داخل mysql روی پکیج ها طراحی میکنن و وجود داره . پس ببینیم داخل کد زیر که چجوری میشه یک select ‌امن انجام داد :

var userId = 1;
var sql    = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function (error, users, fields) {
if (error) throw error;
  // ...
  });

خوب دیدین خیلی راحته و خیلی کاربردی هم هست حتما براتون . میتونین از placeholder هم استفاده کنین به صورت زیر:

connection.query('SELECT * FROM users WHERE id = ?', [userId], function (error, users, fields) {  if (error) throw error;  // ...});

داخل کد بالا دقت کنین که اول توی کوئری به جای مقدار userid علامت سوال میزاریم و بعدش داخل پارامتر بعدی به شکل آرایه ، مقدار مربوط بهش رو پاس میدیم .

حالا کد زیر هم ببینید برای چند placeholder

var age=35;
var userId= 1;
connection.query('SELECT * FROM users WHERE id = ? AND age = ?', [userId,age], function (error, users, fields) {  if (error) throw error;  // ...});

خوب فکر کنم خوب و کافی باشه . میتونین از لینک ریپوزیتوری که اول صفحه دادم مطالب بهتر و کامل تری رو بخونین .

دستورات mysql رو اینجا نمیخواستم بگم . فرض بر اینه که میدونید . ارادت .