Как из 1с8 в MySQL записывать сразу групу строк из ТЗ (ну или сразу всю ТЗ)? #658182


#0 by MikhaDi4
Привет! Подскажите, кто знает, как сабж сделать? SQL синтаксис почти не знаю. Из 1с8 подключаюсь через ОДБЦ к базе MySQL и требуется обновлять одну из табличек этой БД. Прочитал немного по sql, мне вроде подходит оператор MERGE, но до его использования я пока не дошел. Смотрю сначала, как табличку хотябы просто заполнить. Есть оператор insert (ТекстЗапроса = "INSERT INTO `itemsinfo` (id, NAME, value) VALUES (4, ""Леопольд"", 1200)"), он работает, но это получается, что если у меня тысяча строк в 1С, то нужно последовательно тысячу раз сделать такой запрос... Понятно, что чтучки вроде передачи такого запроса : ТекстЗапроса = "INSERT INTO `parser_itemsinfo` SELECT * FROM "+ТЗ; (где ТЗ моя табличка, пусть и с такимиже названиями колонок) выдает ошибку. Вот хочу узнать, может кто знает, как записать в скуль сразу всю табличку из 1С, ну и вообще как лучше внешние sql таблицы обновлять, каким оператором и т.п.?
#1 by Fragster
дарю:
#2 by Kreont
я за "insert" :) Главное учти что есть ограничение на к-во текста в одном запросе, так "на глаз" то всегда делю по макс 1000 строк в один запрос вставки.
#3 by Живой Ископаемый
а что уже нет никаких bulkisert'ов?
#4 by Diversus
#5 by MikhaDi4
угу, я тоже подумал, что если шибко дофига строк в таблице, то это может плохо кончиться, нужно типа порциями сувать. Но хз как
#6 by MikhaDi4
я BULK INSERT смотрел, но там вроде файл надо дать скулю. Это не подходит по моему.
#7 by MikhaDi4
очень не привычно ))) а есть прмер использования на 1с написанный?
#8 by Живой Ископаемый
2 почему? тяжело записать тз в файл? или она того не стоит? :)
#9 by Fragster
проблема, наверное, этот файл мускулю просунуть в доступ
#10 by MikhaDi4
ха ха, ну не, не проблема конечно )) Но, есть ограничения в правах на сервере mysql и он далеко находится (и мне кажется неочень хорошо будет здоровый файл гонять, хотя посмотрю конечно), кроме того, мы хотим уйти от обмена через файл... (сейчас 1с выплевывает файлик, который читается левой программкой и пишется в мускуль).
#11 by Александр_Тверь
можешь воспользоваться готовой компонентой и не сильно переживать.
#12 by Живой Ископаемый
поставь мс скл на сервере 1с, чтобы утилита балкинсерт была бы тут, рядом. Файл нужно подсовывать этой утилите а не мссклю, а она уже может булкать в удаленный мсскл сервер. Ничем от адодб это отличаться не будет.
#13 by Fragster
май эс ку эль
#14 by Живой Ископаемый
Блин, майскл а не мсскл. Тогда не знаю
#15 by Александр_Тверь
вообще, одним запросом это делается примерно так: (10, "Он", 1300), .... (10, "Он", 1400) и т.д. обработка из умеет все что нужно делать. Пользоваться очень легко. Сама разбивает большие таблицы на порции по 1000 строк (по опыту - оптимальный размер, но параметр можно изменить). Можно просто как образец посмотреть. Обработка моя и если нет доступа на инфостарт могу прислать на e-mail.
#16 by Fragster
на самом деле надо рубить по max_allowed_packet
#17 by Александр_Тверь
не факт. разрешенным может быть очень большое количество, но вот тупо зависает. я отправлял таблицу в 10 000 строк - проходило, но медленные чем 10 по 1000.
#18 by Александр_Тверь
кстати, обработка если не получилось с первого раза - делает три попытки передать текущую порцию. если все попытки провалились только тогда прекращает работу и возвращает ошибку.
#19 by Александр_Тверь
количество попыток - так же настраивается.
#20 by MikhaDi4
ну я и имел в виду такой запрос (по ошибке про цикл написал). Доступ есть, к сожалению, только на работе к ИС. Можешь выслать на электронку (mr.samuelsonГАВГАВya.ru)?
#21 by Александр_Тверь
ты собираешь запрос вида INSERT INTO `itemsinfo` (id, NAME, value) VALUES (4, "Леопольд", 1200), (10, "Он", 1300) с нужным количеством строк - и отправляешь один раз. а не по одной строке INSERT INTO `itemsinfo` (id, NAME, value) VALUES (4, "Леопольд", 1200) сейчас вышлю.
#22 by MikhaDi4
Списибо.
#23 by MikhaDi4
Спасибо
#24 by Александр_Тверь
отправил. обработка не очень сложная, но перекрывает практически все потребности по работе с MySQL в части касающейся отправки и приема данных. У меня оно в боевом режиме каждый день используется для обмена с кассовым ПО.
#25 by MikhaDi4
дык этот один запрос (большой) и вызвал у меня сомнения. Его веть на порции делить нужно. А между порциями переданных запросов на скуль, данные в самом скуле, гипотетически, могут измениться.. Обраотку получил.
#26 by Александр_Тверь
а как ты хочешь передавать данные не перечисляя их все? А то, что их их делить надо - это факт.
#27 by MikhaDi4
я не знаю. Думал, что ну, что-то типа контейнера на скуле сделать, заполнить его. А потом таблицу залочить для изменеия кем либо кроме меня и обновить... Но, может это и баловство.
#28 by MikhaDi4
ах да, я не владею терминологией скуля )))
#29 by Александр_Тверь
все зависит от того какие задачи решаются. Но лично мне таким заниматься не приходилось. Ибо просто не нужно.
#30 by MikhaDi4
так у тебя ф-я ОтправитьДанныеПоПодготовленнойТаблице именно то, что в и делает так?
#31 by Александр_Тверь
да. правда еще при этом разбивает таблицу на нужное количество строк + при в случае неудачной отправки данных делает 3 попытки их отправить.
#32 by MikhaDi4
угу. Спасибо, хорошая обработка.
#33 by Александр_Тверь
блин... забыл версию обработки обновить на инфостарте :) у меня есть еще функция ОтправитьДанныеПоСтруктуре т.е. кидаешь структуру в которой ключ имя таблицы, а значение - таблица. и оно все само отправляет. завтра обновлю.
#34 by Александр_Тверь
это если сразу кучу таблиц надо отправить
#35 by Александр_Тверь
+ доделал возможность игнорирования вставки дубликатов. Если отправляемая таблица содержит дубли с тем, что уже есть в таблице на MySQL.
#36 by MikhaDi4
а как-то типа оператора Merge нельзя сделать?
#37 by MikhaDi4
А проверка этих дублей идет по всем полям или список таких (ключевых)полей можно задать?
#38 by ksergey
Уважаемый, подскажи, есть ли вариант "пакетного" запроса для команды UPDATE table SET field1 = ****, field2 = **** WHERE id=xxxxxxx Спасибо
#39 by Александр_Тверь
а что значит "пакетного"? сразу кучу запросов через точку с запятой?
#40 by Александр_Тверь
по ключевым полям. это из области синтаксиса MySQL
#41 by ksergey
наверно типа такого - это же всё одно будет быстрей чем 1000 раз гнать пакеты по одной команде
#42 by Александр_Тверь
нет, такой возможности, на сколько мне известно -нет. Правда обработка из эмулирует пакетную работу. т.е. в нее можно передать один большой запрос разделенный точкой с запятой, а обработка сама его разобьет на отдельные запросы. Вообще не вижу проблемы, если соединение держать открытым (а не каждый раз зыкрывать), то больших проблем не будет. Так же, если нужно ну очень много данных проапдейтить, может проще их удалить (перечислить все id) и залить заново одной командой?
#43 by Александр_Тверь
т.е. первый запрос типа delete - удаляет 1000 записей, которые ты хочешь обновить второй запрос - один instrt на 1000 строк. Правда не уверен, что это будет быстрее чем 1000 раз Update сделать. надо тестить (возможно на разных данных будет разный результат).
#44 by ksergey
понятно. спасибо за обстоятельный ответ
#45 by ksergey
недавно нечто подобное делал для базы сайта на MSSQL. Подход с массой вставкой был реализован по схожей схеме: INSERT INTO dbo.Owner (field1,field2,field3) SELECT value1,value2,value3 UNION ALL SELECT value11,value12,value13 UNION ALL SELECT value21,value22,value23 ... так скорость выросла примерно в 2,5 раза по сравнению если вставлять одиночными пакетами
#46 by Александр_Тверь
думаю очень много зависит от самого характера данных. но я не решал задачу оптимизацию обновления большого массива данных, по этому опыта в данном вопросе - нет.
#47 by Александр_Тверь
если интересно, то обновил до последней версии.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С