21.11.2015, 19:17
|
Новичок на форуме
|
|
Регистрация: 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;
}
}
};
};
|
|
21.11.2015, 19:19
|
Новичок на форуме
|
|
Регистрация: 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',
}
};
|
|
21.11.2015, 19:22
|
Новичок на форуме
|
|
Регистрация: 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
|
|
21.11.2015, 19:51
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Alasdair,
для нормальной работы с базой данных нет смысла в какой либо orm или использования сахара. этим грешат разработчики им кажется это круто, но на самом деле это дерьмо, потому как я должен выучить их прослойки и правила принципы их работы. Описания моделей и так далее. А зачем забивать мне голову вашим APi, если я знаю как работать с базой напрямую.
Кроме того это будет быстрее. Безопаснее так как фильтрацию я буду проводить сам не надеясь на вашу модель в которой вы это не делаете
По поводу вашего кода. Connect с базой данных не постоянный и значит, что ваш код не всегда будет работать. Перед любым запросом стоит проверять есть ли соединение с базой. Если есть выполнять запрос, нет подключатся к базе (можно несколько раз пробовать даже) и уж в случае ошибки писать в лог и письма счастья админу.
|
|
21.11.2015, 20:06
|
Новичок на форуме
|
|
Регистрация: 21.11.2015
Сообщений: 5
|
|
Спасибо за рекомендацию насчет подключения к базе, не учел этот факт. Над валидацией я сейчас как раз работаю. Основная цель научится работать с js и node.js.
|
|
|
|