Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.07.2016, 22:10
Аспирант
Отправить личное сообщение для user71 Посмотреть профиль Найти все сообщения от user71
 
Регистрация: 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);
Ответить с цитированием
  #2 (permalink)  
Старый 31.07.2016, 08:24
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 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'
Ответить с цитированием
  #3 (permalink)  
Старый 31.07.2016, 09:57
Аспирант
Отправить личное сообщение для user71 Посмотреть профиль Найти все сообщения от user71
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2016, 11:18
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

user71,
Ну а что мешает использовать Promise.all? То есть есть массив допустим из 5 обьектов, делаем для каждого connection.query промисифицированную обертку, засовываем в Promise.all и когда все эти операции по вставке каждого обьекта завершатся, вызовится коллбэк в Promise.all().then
Ответить с цитированием
  #5 (permalink)  
Старый 31.07.2016, 12:11
Аспирант
Отправить личное сообщение для user71 Посмотреть профиль Найти все сообщения от user71
 
Регистрация: 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'))
Ответить с цитированием
  #6 (permalink)  
Старый 31.07.2016, 12:30
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
Т.е имена таблиц придется статически вписать в сам запрос к бд.
Тоже можно автоматизировать. Есть же у нас в javascript всякие Object.keys(), цикл for of в ES2015 и всё такое.
Цитата:
А если у каких то объектов добавится свойств а у каких то не добавится то мы приплыли
Ну а как у вас тогда модель данных настроена? Меняется от времени суток?
Ответить с цитированием
  #7 (permalink)  
Старый 31.07.2016, 13:01
Аспирант
Отправить личное сообщение для user71 Посмотреть профиль Найти все сообщения от user71
 
Регистрация: 30.07.2016
Сообщений: 41

destus,
Я сначало пишу базовый функционал потом добавляю все новые и новые фишки. А базовый функционал необходим максимально универсальный чтобы при добавлении нового не приходилось переписывать старое. И в данном случае удобнее всего кидать массив объектов в 1 insert, потому что да по мере написания приложения модель данных будет меняться
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как парсить JSON на клиенте? uakoB Серверные языки и технологии 2 01.08.2013 09:41
как использовать json AquaGen jQuery 15 20.01.2012 09:53
Как удалить таблицу созданную в JS? konstantinopol Общие вопросы Javascript 9 10.09.2011 10:55
Как создать строку JSON с переменными? Артем AJAX и COMET 4 01.11.2008 12:12