מחלקה פשוטה וקלה ל MySQL ב node
-
כתבתי מחלקה פשוטה מאוד וקלה לשימוש עבור טיפול בשאילתות ונתונים ב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 כבר קיים, זה דורס את הנתונים הקודמים לשורה זו. -
וואו!
-
@חוקר לא עיינתי בכל הקוד, אבל סתם עצה קטנה, בסוף כל מתודה תוסיף
return this
, זה יאפשר לשרשר מתודות בלי להשתמש במשתנה מצביע, גם אפשר לעשות את זה קצת יותר גנרי עם אפשרות הרחבה. משהו כזהnew Database(config).select(obj).limit(20).run().then(rows => rows)
-
@יוסף-בן-שמעון אמר במחלקה פשוטה וקלה ל MySQL ב node:
@חוקר לא עיינתי בכל הקוד, אבל סתם עצה קטנה, בסוף כל מתודה תוסיף
return this
, זה יאפשר לשרשר מתודות בלי להשתמש במשתנה מצביע, גם אפשר לעשות את זה קצת יותר גנרי עם אפשרות הרחבה. משהו כזהnew Database(config).select(obj).limit(20).run().then(rows => rows)
ב SELECT למשל שמחזיר שורות לא כ"כ נראה לי מתאים להוסיף return this.
ב INSERT זה מחזיר את הID החדש (אם קיים).
רק ב UPDATE זה יכול להיות רלוונטי, אבל לא כ"כ נראה לי שימושי.
אבל בכל אופן תודה על הערה, נתת לי הבנה שעדיין לא הייתה לי.לבנות משהו מורכב יותר, אפשרי בהחלט, אבל כבר לא כ"כ קריטי עבורי כמו שחיבורים עצמם.
-
@יוסף-בן-שמעון אמר במחלקה פשוטה וקלה ל MySQL ב node:
@חוקר לא עיינתי בכל הקוד, אבל סתם עצה קטנה, בסוף כל מתודה תוסיף
return this
, זה יאפשר לשרשר מתודות בלי להשתמש במשתנה מצביע, גם אפשר לעשות את זה קצת יותר גנרי עם אפשרות הרחבה. משהו כזהnew Database(config).select(obj).limit(20).run().then(rows => rows)
??
אתה בטוח שצריך ``return this``` בשביל לשרשר?? -
@אהרן אם אתה בטוח הפוך או שיש לך קושיה על כך תכתוב. לשאול מישהו שאומר משהו אם הוא בטוח זה לא צורת שיחה נורמלית.
@חוקר ההצעה של @יוסף-בן-שמעון מורכבת מכפי שחשבת. הוא רוצה שעד שלא תריץ את run שום דבר לא ירות רק "יתכונן לריצה". זה מאוד יפה וככה עובדים הרבה מחלקות. -
@dovid אמר במחלקה פשוטה וקלה ל MySQL ב node:
@אהרן אם אתה בטוח הפוך או שיש לך קושיה על כך תכתוב. לשאול מישהו שאומר משהו אם הוא בטוח זה לא צורת שיחה נורמלית.
@חוקר ההצעה של @יוסף-בן-שמעון מורכבת מכפי שחשבת. הוא רוצה שעד שלא תריץ את run שום דבר לא ירות רק "יתכונן לריצה". זה מאוד יפה וככה עובדים הרבה מחלקות.הבנתי מיד, אני משתמש בזה ב PHP YII2 .
אבל על זה עניתי שאין לי צורך להשקיע כ"כ.
רק הבנתי מדבריו ש return this יכול לעזור גם ללא קשר לחלק השני של מה שכתב, ועל זה התייחסתי.
עיין שם ודו"ק. -
@חוקר מצטער, התוכן הבא לא רלוונטי למה שהוא אמר:
ב SELECT למשל שמחזיר שורות לא כ"כ נראה לי מתאים להוסיף return this.
ב INSERT זה מחזיר את הID החדש (אם קיים).
רק ב UPDATE זה יכול להיות רלוונטי, אבל לא כ"כ נראה לי שימושי.
הוא דיבר בעיקר על הSELECT וזה מאוד רלוונטי לשם, כי אתה יכול לקמבן פילטרים, אבל זה מאוד מורכב למימוש לדעתי.
-
@חוקר אמר במחלקה פשוטה וקלה ל MySQL ב node:
let query = 'UPDATE `' + table + '` SET';
פה יש פונטנציאל של הזרקה ב table.
תשתמש ב connection.escapeIdhttps://www.npmjs.com/package/mysql#escaping-query-identifiers
-
@אהרן אמר במחלקה פשוטה וקלה ל MySQL ב node:
??
אתה בטוח שצריך ``return this``` בשביל לשרשר??תנסה את שתי המחלקות האלה ותראה איזה מהם יכשר
class A{ constructor(num){ this.i = num; } plus(){ this.i ++ } minus(){ this.i -- } } class B{ constructor(num){ this.i = num; } plus(){ this.i ++ return this } minus(){ this.i -- return this } } new B(2).plus().minus() new A(2).plus().minus()
-
@יוסף-בן-שמעון
משום משה זכרתי (בטעות) שהשרשור תמיד מתייחס לאוביקט הראשון. זו טעות מוחלטת?