כתבתי מחלקה פשוטה מאוד וקלה לשימוש עבור טיפול בשאילתות ונתונים בMYSQL.
מי שרוצה להשתמש, בשמחה.
למי שיש מה להאיר, להעיר או לתקן, בחדוה.
המחלקה משתמשת בספריה הפשוטה של mysql ומחריזה פרומיס.
המחלקה מיישמת את הפונקציה של מניעת הזרקת SQL (לא יודע איך קוראים לזה בשם המקצועי).
ניתן לבצע שאילתות פשוטות ולקבל את הנתונים, ניתן לבצע הכנסת נתונים, עדכון נתונים, וצור או עדכן נתונים.
בכל שאילתה זה פותח וסוגר את החיבור, ולא משאיר חיבור פתוח (כך קיבלתי מרבותי, שלא להשאיר חיבור פתוח).
להלן המחלקה, אשמח לתגובתכם.
const mysql = require( 'mysql' );
module.exports = class Database {
constructor( config ) {
if (config.database === undefined || config.database === '' || config.database === null){
config.database = config.user;
}
this.config = config;
}
query( sql, args ) {
let connection = new mysql.createConnection( this.config );
return new Promise( ( resolve, reject ) => {
connection.query( sql, args, ( err, rows ) => {
if ( err ){
connection.end();
return reject( err );
}else{
connection.end();
resolve( rows );
}
} );
} );
}
selectSQL(query, args){
return this.query(query, args);
}
insertSQL(data, table){
let query = 'INSERT INTO `' + table + '` (';
for (let d_key in data){
query += '`' + d_key + '`, ';
}
query = query.replace(/, $/, '');
query += ') VALUES (';
for (let d_key in data){
query += '?, ';
}
query = query.replace(/, $/, '');
query += ')';
let args = [];
for (let d_key in data){
args.push(data[d_key]);
}
return this.query(query, args).then(rows => {
if (rows.insertId && rows.insertId !== 0){
return rows.insertId;
} else{
return null;
}
});
}
insertORupdateSQL(data, table){
let query = 'INSERT INTO `' + table + '` (';
for (let d_key in data){
query += '`' + d_key + '`, ';
}
query = query.replace(/, $/, '');
query += ') VALUES (';
for (let d_key in data){
query += '?, ';
}
query = query.replace(/, $/, '');
query += ')';
query += ' ON DUPLICATE KEY UPDATE ';
for (let d_key in data){
query += "`" + d_key + "` = VALUES(`" + d_key + "`), ";
}
query = query.replace(/, $/, '');
let args = [];
for (let d_key in data){
args.push(data[d_key]);
}
return this.query(query, args).then(rows => {
if (rows.insertId && rows.insertId !== 0){
return rows.insertId;
} else{
return null;
}
});
}
updateSQL(data, table, idcolum, id, addstr = ''){
let query = 'UPDATE `' + table + '` SET';
for (let d_key in data){
query += ' `' + d_key + '` = ?, ';
}
query = query.replace(/, $/, '');
query += ' WHERE `' + idcolum + '` = ' + " ? " + addstr;
let args = [];
for (let d_key in data){
args.push(data[d_key]);
}
args.push(id);
return this.query(query, args).then(rows => {
return rows;
});
}
};
להלן דוגמה פשוטה למימוש
שימו לב, באם הפרמטר database ריק, הוא מקבל את הערך של user.
const config = {
host: "host",
user: "user",
password: "password",
database: ""
};
const Database = require('./db.js');
let database = new Database(config);
database.query('CREATE TABLE `test` (`test1` int(5) NOT NULL, `test2` int(5) DEFAULT NULL, `test3` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, `test4` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`test1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci').then(rows => {
database.insertSQL({'test1' : '35', 'test2' : '31', 'test3' : '12', 'test4' : 'test',}, 'test').then(rows => {
database.updateSQL({'test2' : '22', 'test3' : 'aa'}, 'test', 'test1', '35').then(rows => {
database.insertORupdateSQL({'test1' : '40', 'test2' : '10', 'test3' : 'bb', 'test4' : 'sql_test',}, 'test').then(rows => {console.log(rows);})
})
})
});
insertSQL מקבל אובייקט של שמות עמודות = הערך שלהם, ומשתנה של שם הטבלה.
updateSQL מקבל אובייקט של שמות עמודות = הערך החדש שלהם, ומשתנה של שם הטבלה, משתנה של עמודת ה PK ומשתנה של הערך של עמודת הPK של השורה שעליה יש לבצע את השינויים.
insertORupdateSQL הוא כמו insertSQL רק שבאם הערך של PK כבר קיים, זה דורס את הנתונים הקודמים לשורה זו.

