דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. מחלקה פשוטה וקלה ל MySQL ב node

מחלקה פשוטה וקלה ל MySQL ב node

מתוזמן נעוץ נעול הועבר תכנות
14 פוסטים 5 כותבים 362 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ח מנותק
    ח מנותק
    חוקר
    כתב ב נערך לאחרונה על ידי חוקר
    #1

    כתבתי מחלקה פשוטה מאוד וקלה לשימוש עבור טיפול בשאילתות ונתונים ב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 כבר קיים, זה דורס את הנתונים הקודמים לשורה זו.

    תגובה 1 תגובה אחרונה
    5
    • י מנותק
      י מנותק
      יוסף בן שמעון
      כתב ב נערך לאחרונה על ידי
      #2

      וואו!

      תגובה 1 תגובה אחרונה
      0
      • ח מנותק
        ח מנותק
        חוקר
        כתב ב נערך לאחרונה על ידי
        #3

        זה אותו רעיון של מה שפרסמתי כאן ל PHP

        תגובה 1 תגובה אחרונה
        0
        • ח מנותק
          ח מנותק
          חוקר
          כתב ב נערך לאחרונה על ידי
          #4

          אשמח מי שיכול לבדוק ולהעיר.
          בסך הכל כל ההתקדמות שלי בנוד נזקפת לזכותכם.

          תגובה 1 תגובה אחרונה
          0
          • י מנותק
            י מנותק
            יוסף בן שמעון
            כתב ב נערך לאחרונה על ידי יוסף בן שמעון
            #5

            @חוקר לא עיינתי בכל הקוד, אבל סתם עצה קטנה, בסוף כל מתודה תוסיף return this, זה יאפשר לשרשר מתודות בלי להשתמש במשתנה מצביע, גם אפשר לעשות את זה קצת יותר גנרי עם אפשרות הרחבה. משהו כזה

            new Database(config).select(obj).limit(20).run().then(rows => rows)
            
            ח א 2 תגובות תגובה אחרונה
            3
            • ח מנותק
              ח מנותק
              חוקר
              השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
              #6

              @יוסף-בן-שמעון אמר במחלקה פשוטה וקלה ל MySQL ב node:

              @חוקר לא עיינתי בכל הקוד, אבל סתם עצה קטנה, בסוף כל מתודה תוסיף return this, זה יאפשר לשרשר מתודות בלי להשתמש במשתנה מצביע, גם אפשר לעשות את זה קצת יותר גנרי עם אפשרות הרחבה. משהו כזה

              new Database(config).select(obj).limit(20).run().then(rows => rows)
              

              ב SELECT למשל שמחזיר שורות לא כ"כ נראה לי מתאים להוסיף return this.
              ב INSERT זה מחזיר את הID החדש (אם קיים).
              רק ב UPDATE זה יכול להיות רלוונטי, אבל לא כ"כ נראה לי שימושי.
              אבל בכל אופן תודה על הערה, נתת לי הבנה שעדיין לא הייתה לי.

              לבנות משהו מורכב יותר, אפשרי בהחלט, אבל כבר לא כ"כ קריטי עבורי כמו שחיבורים עצמם.

              תגובה 1 תגובה אחרונה
              0
              • א מנותק
                א מנותק
                אהרן
                השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
                #7

                @יוסף-בן-שמעון אמר במחלקה פשוטה וקלה ל MySQL ב node:

                @חוקר לא עיינתי בכל הקוד, אבל סתם עצה קטנה, בסוף כל מתודה תוסיף return this, זה יאפשר לשרשר מתודות בלי להשתמש במשתנה מצביע, גם אפשר לעשות את זה קצת יותר גנרי עם אפשרות הרחבה. משהו כזה

                new Database(config).select(obj).limit(20).run().then(rows => rows)
                

                ??
                אתה בטוח שצריך ``return this``` בשביל לשרשר??

                י תגובה 1 תגובה אחרונה
                1
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @אהרן אם אתה בטוח הפוך או שיש לך קושיה על כך תכתוב. לשאול מישהו שאומר משהו אם הוא בטוח זה לא צורת שיחה נורמלית.
                  @חוקר ההצעה של @יוסף-בן-שמעון מורכבת מכפי שחשבת. הוא רוצה שעד שלא תריץ את run שום דבר לא ירות רק "יתכונן לריצה". זה מאוד יפה וככה עובדים הרבה מחלקות.

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  ח תגובה 1 תגובה אחרונה
                  4
                  • ח מנותק
                    ח מנותק
                    חוקר
                    השיב לdovid ב נערך לאחרונה על ידי
                    #9

                    @dovid אמר במחלקה פשוטה וקלה ל MySQL ב node:

                    @אהרן אם אתה בטוח הפוך או שיש לך קושיה על כך תכתוב. לשאול מישהו שאומר משהו אם הוא בטוח זה לא צורת שיחה נורמלית.
                    @חוקר ההצעה של @יוסף-בן-שמעון מורכבת מכפי שחשבת. הוא רוצה שעד שלא תריץ את run שום דבר לא ירות רק "יתכונן לריצה". זה מאוד יפה וככה עובדים הרבה מחלקות.

                    הבנתי מיד, אני משתמש בזה ב PHP YII2 .
                    אבל על זה עניתי שאין לי צורך להשקיע כ"כ.
                    רק הבנתי מדבריו ש return this יכול לעזור גם ללא קשר לחלק השני של מה שכתב, ועל זה התייחסתי.
                    עיין שם ודו"ק.

                    dovidD תגובה 1 תגובה אחרונה
                    0
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      השיב לחוקר ב נערך לאחרונה על ידי dovid
                      #10

                      @חוקר מצטער, התוכן הבא לא רלוונטי למה שהוא אמר:

                      ב SELECT למשל שמחזיר שורות לא כ"כ נראה לי מתאים להוסיף return this.

                      ב INSERT זה מחזיר את הID החדש (אם קיים).

                      רק ב UPDATE זה יכול להיות רלוונטי, אבל לא כ"כ נראה לי שימושי.

                      הוא דיבר בעיקר על הSELECT וזה מאוד רלוונטי לשם, כי אתה יכול לקמבן פילטרים, אבל זה מאוד מורכב למימוש לדעתי.

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      2
                      • M מנותק
                        M מנותק
                        magicode
                        כתב ב נערך לאחרונה על ידי
                        #11

                        @חוקר אמר במחלקה פשוטה וקלה ל MySQL ב node:

                         let query = 'UPDATE `' + table + '` SET'; 
                        

                        פה יש פונטנציאל של הזרקה ב table.
                        תשתמש ב connection.escapeId

                        https://www.npmjs.com/package/mysql#escaping-query-identifiers

                        תגובה 1 תגובה אחרונה
                        5
                        • י מנותק
                          י מנותק
                          יוסף בן שמעון
                          השיב לאהרן ב נערך לאחרונה על ידי
                          #12

                          @אהרן אמר במחלקה פשוטה וקלה ל 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()
                          
                          א תגובה 1 תגובה אחרונה
                          1
                          • א מנותק
                            א מנותק
                            אהרן
                            השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
                            #13

                            @יוסף-בן-שמעון
                            משום משה זכרתי (בטעות) שהשרשור תמיד מתייחס לאוביקט הראשון. זו טעות מוחלטת?

                            י תגובה 1 תגובה אחרונה
                            0
                            • י מנותק
                              י מנותק
                              יוסף בן שמעון
                              השיב לאהרן ב נערך לאחרונה על ידי
                              #14

                              @אהרן כנראה שכן, כל מתודה מחזירה ערך והמתודה הבאה מתייחסת לערך המוחזר

                              תגובה 1 תגובה אחרונה
                              1

                              בא תתחבר לדף היומי!
                              • התחברות

                              • אין לך חשבון עדיין? הרשמה

                              • התחברו או הירשמו כדי לחפש.
                              • פוסט ראשון
                                פוסט אחרון
                              0
                              • דף הבית
                              • קטגוריות
                              • פוסטים אחרונים
                              • משתמשים
                              • חיפוש
                              • חוקי הפורום