Как записать 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); |
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' |
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,
Ну а что мешает использовать Promise.all? То есть есть массив допустим из 5 обьектов, делаем для каждого connection.query промисифицированную обертку, засовываем в Promise.all и когда все эти операции по вставке каждого обьекта завершатся, вызовится коллбэк в Promise.all().then |
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')) |
Цитата:
Цитата:
|
destus,
Я сначало пишу базовый функционал потом добавляю все новые и новые фишки. А базовый функционал необходим максимально универсальный чтобы при добавлении нового не приходилось переписывать старое. И в данном случае удобнее всего кидать массив объектов в 1 insert, потому что да по мере написания приложения модель данных будет меняться |
Часовой пояс GMT +3, время: 11:00. |