Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.11.2015, 19:17
Новичок на форуме
Отправить личное сообщение для Alasdair Посмотреть профиль Найти все сообщения от Alasdair
 
Регистрация: 21.11.2015
Сообщений: 5

Прошу раскритиковать наслойку работы с MySql.
Всем доброго! Начал изучать js и работу с node.js, для осознания заблуждений и неправильного подхода прошу рассмотреть и сказать свое мнение. Очень надеюсь на здоровую критику и пинки в нужном направлении))))) Я еще не закончил его(((

mysql = Use("mysql");
connection = mysql.createConnection({
    user: Cube.db.user,
    password: Cube.db.password,
    database: Cube.db.database,
    host: Cube.db.host
});

Cube.db.connect = true;

ActiveQuery = function(){

    this.db = {};
    this.result = {};
    this.systemErrors = [
        'Не существует такого столбца в таблице: ',
        'Не верные передаваемые данные, надо передавать объект ключ которого название столбца, а значение является значением столбца ({name: \'Djon\'})',
        'Не верные передаваемые данные, надо передавать массив значение которого является названием столбца ([name])',
        ' надо привести к типу:',
        'Надо передать данные'
    ];

    this.findOne = function(data, cols){
        if(this.error({data: data, cols: cols})){
            return false;
        }
        var sql = 'SELECT ';
        var count, step, result = false;
        if(cols == undefined){
            sql += '*';
        }
        else{
            count = Library.count(cols), step = 1;
            for(var col in cols){
                sql += '`'+cols[col]+'`';
                if(count > step){
                    sql += ', ';
                }
                step++;
            }
        }
        sql += ' FROM `'+this.db.name+'` WHERE ';
        count = Library.count(data);
        if(count && data != undefined){
            step = 1;
            for(var e in data){
                sql += e+' = '+data[e];
                if(count > step){
                    sql += ' AND ';
                }
                step++;
            }
        }
        else{
            sql += this.db.idCol+' <> 0';
        }
        sql += ' ORDER BY '+this.db.idCol+' DESC LIMIT 1';
        //this.getQuery(sql);
        console.log(sql);
        //return this.result;
    };

    this.findAll = function(data, cols){
        if(this.error({data: data, cols: cols})){
            return false;
        }
        var sql = 'SELECT ';
        var count, step, result = false;
        if(cols == undefined){
            sql += '*';
        }
        else{
            count = Library.count(cols), step = 1;
            for(var col in cols){
                sql += '`'+cols[col]+'`';
                if(count > step){
                    sql += ', '
                }
                step++;
            }
        }
        sql += ' FROM `'+this.db.name+'` WHERE ';
        count = Library.count(data);
        if(count && data != undefined){
            step = 1;
            for(var e in data){
                sql += e+' = '+data[e];
                if(count > step){
                    sql += ' AND ';
                }
                step++;
            }
        }
        else{
            sql += this.db.idCol+' <> 0';
        }
        //this.getQuery(sql);
        console.log(sql);
    };

    this.update = function(id, data){
        if(this.error({data: id})){
            return false;
        }
        if(this.error({data: data})){
            return false;
        }
        if(id == undefined || !Library.count(id) || data == undefined || !Library.count(data)){
            console.log(this.systemErrors[4]);
            return false;
        }
        var sql = 'UPDATE '+this.db.name+' SET ';
        var count = Library.count(data), step = 1;
        for(var e in data){
            sql += e+'='+data[e];
            if(count > step){
                sql += ', ';
            }
            step++;
        }
        count = Library.count(id);
        step = 1;
        sql += ' WHERE ';
        for(var i in id){
            sql += i+'='+id[i];
            if(count > step){
                sql += ' AND ';
            }
            step++;
        }
        //this.getQuery(sql);
        console.log(sql);
    };

    this.deleteAll = function(data){
        if(data == undefined || !Library.count(data)){
            console.log(this.systemErrors[4]);
            return false;
        }
        if(this.error({data: data})){
            return false;
        }
        var sql = 'DELETE FROM '+this.db.name+' WHERE ';
        var count = Library.count(data), step = 1;
        for(var e in data){
            sql += e+'='+data[e];
            if(count > step){
                sql += ' AND ';
            }
            step++;
        }
        console.log(sql);
    };

    this.findBySql = function(sql){
        console.log(sql);
    };

    this.count = function(data){
        if(this.error({data: data})){
            return false;
        }
        var sql = 'SELECT COUNT(*) FROM '+this.db.name+' ';
        if(data != undefined){
            sql += ' WHERE ';
            var count = Library.count(data), step = 1;
            for(var e in data){
                sql += e+'='+data[e];
                if(count > step){
                    sql += ' AND ';
                }
                step++;
            }
        }
        console.log(sql);
    };

    this.countGroup = function(data){
        if(this.error({count: data})){
            return false;
        }
        var sql = 'SELECT ', partSql = ' WHERE ', colSql = '';
        var count = Library.count(data), step = 1, contrl = false;
        for(var e in data){
            var index = 0;
            sql += e;
            colSql += e;
            if(contrl && Library.count(data[e]) > 1){
                partSql += ' OR ';
            }
            contrl = true;
            for(var k in data[e]){
                partSql += e+'='+data[e][k];
                if(Library.count(data[e]) > index+1){
                    partSql += ' OR ';
                }
                index++;
            }
            if(count > step){
                sql += ', ';
                colSql += ', ';
            }
            step++;
        }
        sql += ', COUNT(*) FROM '+this.db.name+partSql+' GROUP BY '+colSql;
        console.log(sql);
    };

    this.getQuery = function(sql){
        connection.query(sql, function(error, result, fields) {
            console.log(result);
        });
    };

    this.error = function(data){
        result = false;
        for(var e in data){
            switch(e) {
                case 'data':
                    if(data[e] != undefined){
                        if(Object.prototype.toString.call(data[e]) == '[object Array]'){
                            console.log(this.systemErrors[1]);
                            return true;
                        }
                        for(var n in data[e]){
                            if(this.db.cols[n] == undefined){
                                console.log(this.systemErrors[0]+n);
                                return true;
                            }
                            else if(typeof data[e][n] != this.db.cols[n]){
                                console.log(this.db.label[n]+this.systemErrors[3]+' '+this.db.cols[n]);
                                return true;
                            }
                        }
                    }
                    break;
                case 'cols':
                    if(data[e] != undefined){
                        if(Object.prototype.toString.call(data[e]) != '[object Array]'){
                            console.log(this.systemErrors[2]);
                            return true;
                        }
                        for(var n in data[e]){
                            if(this.db.cols[data[e][n]] == undefined){
                                console.log(this.systemErrors[0]+data[e][n]);
                                return true;
                            }
                        }
                    }
                    break;
                case 'count':
                    if(data[e] != undefined){
                        if(Library.count(data[e]) == 0){
                            console.log(this.systemErrors[4]);
                            return true;
                        }
                        if(Object.prototype.toString.call(data[e]) == '[object Array]'){
                            console.log(this.systemErrors[1]);
                            return true;
                        }
                        for(var n in data[e]){
                            if(this.db.cols[n] == undefined){
                                console.log(this.systemErrors[0]+n);
                                return true;
                            }
                            for(var j in data[e][n]){
                                if(typeof data[e][n][j] != this.db.cols[n]){
                                    console.log(this.db.label[n]+this.systemErrors[3]+' '+this.db.cols[n]);
                                    return true;
                                }
                            }
                        }
                    }
                    else{
                        console.log(this.systemErrors[4]);
                        return true;
                    }
                    break;
            }
        }
    };
};
Ответить с цитированием
  #2 (permalink)  
Старый 21.11.2015, 19:19
Новичок на форуме
Отправить личное сообщение для Alasdair Посмотреть профиль Найти все сообщения от Alasdair
 
Регистрация: 21.11.2015
Сообщений: 5

как он отрабатывает

создается объект таблицы
Use('ActiveQuery', 'core');

User = new ActiveQuery();
User.db = {
        name: 'user',
        idCol: 'id',
        cols: {
            'id': 'number',
            'username': 'string',
            'email': 'string',
            'password_hash': 'string',
            'auth_key': 'string',
            'confirmed_at': 'number',
            'unconfirmed_email': 'string',
            'blocked_at': 'number',
            'registration_ip': 'string',
            'created_at': 'number',
            'updated_at': 'number',
            'flags': 'number',
        },
        require: [
            'username',
            'email',
        ],
        label: {
            'id': 'Id',
            'username': 'Логин',
            'email': 'email',
            'password_hash': 'Password Hash',
            'auth_key': 'Auth Key',
            'confirmed_at': 'Confirmed At',
            'unconfirmed_email': 'Unconfirmed Email',
            'blocked_at': 'Bloced At',
            'registration_ip': 'registration IP',
            'created_at': 'Create At',
            'updated_at': 'Updated At',
            'flags': 'Flags',
        }
    };
Ответить с цитированием
  #3 (permalink)  
Старый 21.11.2015, 19:22
Новичок на форуме
Отправить личное сообщение для Alasdair Посмотреть профиль Найти все сообщения от Alasdair
 
Регистрация: 21.11.2015
Сообщений: 5

и планирую его так использовать

Use('User', 'model');


User.findOne({id: 1, username: 'vasya'}, ['id']); // SELECT `id` FROM `user` WHERE id = 1 AND username = vasya ORDER BY id DESC LIMIT 1
User.findOne({}, ['id']); // SELECT `id` FROM `user` WHERE id <> 0 ORDER BY id DESC LIMIT 1
User.findOne({id: 1, username: 'vasya'}); // SELECT * FROM `user` WHERE id = 1 AND username = vasya ORDER BY id DESC LIMIT 1
User.findOne(); // SELECT * FROM `user` WHERE id <> 0 ORDER BY id DESC LIMIT 1

User.findAll({id: 1, username: 'vasya'}, ['id']); // SELECT `id` FROM `user` WHERE id = 1 AND username = vasya
User.findAll({}, ['id']); // SELECT `id` FROM `user` WHERE id <> 0
User.findAll({id: 1, username: 'vasya'}); // SELECT * FROM `user` WHERE id = 1 AND username = vasya
User.findAll(); // SELECT * FROM `user` WHERE id <> 0

User.findBySql('SELECT COUNT(*) FROM user');

User.update({id: 5}, {username: 'dgdfg', email: 'sdfsd@dfgdf.sf'}); // UPDATE user SET username=dgdfg, email=sdfsd@dfgdf.sf WHERE id=5
User.update({id: 5, username: 'aaAAA'}, {username: 'dgdfg', email: 'sdfsd@dfgdf.sf'}); // UPDATE user SET username=dgdfg, email=sdfsd@dfgdf.sf WHERE id=5 AND username=aaAAA

User.count(); // SELECT COUNT(*) FROM user
User.count({id: 5}); // SELECT COUNT(*) FROM user  WHERE id=5

User.deleteAll({id: 4}); // DELETE FROM user WHERE id=4
User.deleteAll({id: 4, 'username': 'user'}); // DELETE FROM user WHERE id=4 AND username=user

User.countGroup({id: [5, 8], sex:[4,7]}); // SELECT id, sex, COUNT(*) FROM user WHERE id=5 OR id=8 OR sex=4 OR sex=7 GROUP BY id, sex
User.countGroup({id: [5, 8], sex:''}); // SELECT id, sex, COUNT(*) FROM user WHERE id=5 OR id=8 GROUP BY id, sex
Ответить с цитированием
  #4 (permalink)  
Старый 21.11.2015, 19:51
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Alasdair,
для нормальной работы с базой данных нет смысла в какой либо orm или использования сахара. этим грешат разработчики им кажется это круто, но на самом деле это дерьмо, потому как я должен выучить их прослойки и правила принципы их работы. Описания моделей и так далее. А зачем забивать мне голову вашим APi, если я знаю как работать с базой напрямую.
Кроме того это будет быстрее. Безопаснее так как фильтрацию я буду проводить сам не надеясь на вашу модель в которой вы это не делаете
По поводу вашего кода. Connect с базой данных не постоянный и значит, что ваш код не всегда будет работать. Перед любым запросом стоит проверять есть ли соединение с базой. Если есть выполнять запрос, нет подключатся к базе (можно несколько раз пробовать даже) и уж в случае ошибки писать в лог и письма счастья админу.
Ответить с цитированием
  #5 (permalink)  
Старый 21.11.2015, 20:06
Новичок на форуме
Отправить личное сообщение для Alasdair Посмотреть профиль Найти все сообщения от Alasdair
 
Регистрация: 21.11.2015
Сообщений: 5

Спасибо за рекомендацию насчет подключения к базе, не учел этот факт. Над валидацией я сейчас как раз работаю. Основная цель научится работать с js и node.js.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приглашаем web-программистов (php, MySQL, Javascript). smithandpartners Работа 2 06.09.2013 21:17
Визуальные средства для работы с MySQL SeGun Серверные языки и технологии 3 25.08.2013 13:22
Приглашаем web-программистов (php, MySQL, Javascript) на постоянной основе smithandpartners Работа 0 15.11.2012 20:23
Приглашаем web-программистов (php, MySQL, Javascript). smithandpartners Работа 3 06.11.2012 22:29
Приглашаем web-программистов (php, MySQL, Javascript). smithandpartners Работа 2 18.08.2012 21:51