30.07.2016, 22:10
|
Аспирант
|
|
Регистрация: 30.07.2016
Сообщений: 41
|
|
Как записать JSON объект в mysql таблицу.
Доброго времени суток!
Пишу приложение на js для node js. Суть программы: подключаемся к сайту по http, делаем запрос, получаем json объект, записываем его в mysql. Для запросов использую модуль "request" тут проблем никаких нет. typeof (body) Object. А вот дальше я не знаю что с ним делать. Дело в том что этот body представляет из себя массив вложенных объектов(массив объектов некоторые из свойства которых тоже объекты со своими свойствами). Имена свойств объектов не совпадают с именами таблиц и прежде чем поместить в таблицу некоторые свойства нужно сложить.
Я прочитал про jsonrevived там говорится о переопределении типов значений свойств объектов, а вот можно ли полностью переписать весь массив объектов, поменять его структуру, имена свойств итд? примеров не нашел. Такое вообще возможно?
За неимением лучшего я просто создал конструктор объекта который соответствует mysql таблицам и в цикле скопировал в новый массив объектов уже без вложений. Как теперь его вставить в sql insert? , будучи просто закинутым sql не распознает в этом строки и таблицы, а в цикле перебирать массив не получается потому что sql.query асинхронная функция она не видит перебора только последнее значение. Как быть.
собственно сам код
function flf (key, value) {
if (key == 'c') return (value = Boolean(value));
if (key == 'f') return new Date(value*1000);
return value;
};
function molotapi(){ req({ url : url,json : true,jsonReviver : flf},function(error,response,body){
if(!error && response.statusCode == 200)
{
var pet = [];
for (var i in body.response)
{
pet[i] = new SuperPet(
body.response[i].a+" "+body.response[i].b,
body.response[i].e.f,
body.response[i].d,
body.response[i].c,
body.response[i].hasOwnProperty("v"),
body.response[i].e.p);
};
console.log(pet);
client.getConnection(function(error,connection){
connection.query('INSERT INTO pets SET ?',pet, function(error,result){if(error) console.log(error); connection.release() });
});
}
});};
var timer = setInterval(molotapi,300000);
|
|
31.07.2016, 08:24
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
user71,
Может название свойств в обьекте должно совпадать с именем столбцов в таблице? В документации пишут что все возможно.
https://github.com/mysqljs/mysql#escaping-query-values
var post = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
// Neat!
});
console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'
|
|
31.07.2016, 09:57
|
Аспирант
|
|
Регистрация: 30.07.2016
Сообщений: 41
|
|
destus,
Да, если в query кинуть 1 объект то все работает. Все так. Но у меня не один объект а массив объектов. Я же привел код.
так работает
var post = {id: 1, title: 'Hello MySQL'};
2
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
3
// Neat!
4
});
вот так нет
var post = [{id: 1, title: 'Hello MySQL'},{id: 2, title: 'DIE MySQL'},{id: 3, title: 'MUST DIE MySQL'}];
2
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
3
// Neat!
4
});
Все дело в том что вот этот модуль node-mysql, он умеет раскрывать и подставлять объекты, массивы, но когда ему пихают вложенный объект или массив объектов он как бы первый уровень раскрывает а остальное делает .toString().
Последний раз редактировалось user71, 31.07.2016 в 09:59.
|
|
31.07.2016, 11:18
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
user71,
Ну а что мешает использовать Promise.all? То есть есть массив допустим из 5 обьектов, делаем для каждого connection.query промисифицированную обертку, засовываем в Promise.all и когда все эти операции по вставке каждого обьекта завершатся, вызовится коллбэк в Promise.all().then
|
|
31.07.2016, 12:11
|
Аспирант
|
|
Регистрация: 30.07.2016
Сообщений: 41
|
|
destus,
Т.е будет 5 connection.query? Что быстрее 5 query или 1 query с 5 объектами? -)
Я тут почитал доки и нашел в них интересную штуку - многомерный массив он вставляет в правильном формате, но без ключей что неудобно. Т.е имена таблиц придется статически вписать в сам запрос к бд. А если у каких то объектов добавится свойств а у каких то не добавится то мы приплыли. По этой причине и был выбран именно объект, а еще потому что парсинг из json строки дает объект. Т.е вообще говоря самый оптимальный вариант это stream прямо из request в mysql. В mysql есть функция mysql.format() в request есть JSON.Revived(). Как с помощью этих двух функций получить из [{},{},{{}}] connection.query( (key='value1',key='value2'),(key='value1',key='val ue2'),(key='value1',key='value2')(key='value1',key ='value2'))
|
|
31.07.2016, 12:30
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Цитата:
|
Т.е имена таблиц придется статически вписать в сам запрос к бд.
|
Тоже можно автоматизировать. Есть же у нас в javascript всякие Object.keys(), цикл for of в ES2015 и всё такое.
Цитата:
|
А если у каких то объектов добавится свойств а у каких то не добавится то мы приплыли
|
Ну а как у вас тогда модель данных настроена? Меняется от времени суток?
|
|
31.07.2016, 13:01
|
Аспирант
|
|
Регистрация: 30.07.2016
Сообщений: 41
|
|
destus,
Я сначало пишу базовый функционал потом добавляю все новые и новые фишки. А базовый функционал необходим максимально универсальный чтобы при добавлении нового не приходилось переписывать старое. И в данном случае удобнее всего кидать массив объектов в 1 insert, потому что да по мере написания приложения модель данных будет меняться
|
|
|
|