|
v7: Обработка ошибок при работе с Mysql | ☑ | ||
---|---|---|---|---|
0
popoff17
10.11.13
✎
03:51
|
Здравствуйте!
Из 1с я загружаю данные на сайт, в бд Mysql, посредством внешней обработки. смысл такой: я в цикле читаю по очереди всю номенклатуру и на каждой позиции посылаю запрос на внесение. Есть момент, что данные уже присутствуют, тогда обработка выдаст ошибку и цикл прервется. вот код внесения в базу: СтрЗапроса1="insert into `olntp_virtuemart_categories` (`virtuemart_category_id`, `virtuemart_vendor_id`, `published`)VALUES('"+ГруппаКод+"', '1', '1')"; Table=conn.execute(СтрЗапроса1); если такая запись уже есть в бд, то появляется ошибка о дублировании и цикл обрывается. Подсажите, как правильно обработать запрос, чтобы при возникновении ошибки цикл не обрывался, а переходил на следующую итеррацию? |
|||
1
КонецЦикла
10.11.13
✎
04:22
|
INSERT INTO ХХХ VALUES ('как', 'жить')
ON DUPLICATE KEY UPDATE Key = 'так' |
|||
2
КонецЦикла
10.11.13
✎
04:22
|
||||
3
popoff17
10.11.13
✎
05:38
|
хороший пример, спасибо, но тут есть нюанс:
в поле id таблицы mysql (автоинкремент) я вношу код номенклатуры. Соответственно если я буду обрабатывать таким образом - будет рассинхронизация данных. хотелось бы чтобы выглядело как то так: Цикл #получаю номенклатуру, объявляю переменные СтрЗапроса1="insert into `olntp_virtuemart_categories` (`virtuemart_category_id`, `virtuemart_vendor_id`, `published`)VALUES('"+ГруппаКод+"', '1', '1')"; Table=conn.execute(СтрЗапроса1); #тут условие: если Table прошло без ошибок - следующая итеррация, если с ошибкой - Сообщить код. конецЦикла |
|||
4
kokamoonga
10.11.13
✎
07:16
|
(0) ловить исключения только.
Если нет необходимости обрабатывать исключение можно использовать синтаксис с IGNORE, тогда MySql втихую проигнорирует эту строку в случае ошибки Если по исключению нужно производить какие-то манипуляции тогда см. выше. |
|||
5
popoff17
10.11.13
✎
07:35
|
(4) а про IGNORE можно подробнее? это как (1) предложил, в запросе пишется?
|
|||
6
kokamoonga
10.11.13
✎
07:40
|
(5) http://dev.mysql.com/doc/refman/5.6/en/insert.html
официальная документация умеет подробности лучше чем я |
|||
7
kokamoonga
10.11.13
✎
07:41
|
INSERT IGNORE INTO <далее везде>
|
|||
8
КонецЦикла
10.11.13
✎
13:29
|
Типа Попытка - Исключение :)
Можно рано или поздно нарваться на грабли Лучше подумать... (3) Какая рассинхронизация? У тебя если ругается на вставку не уникального ключа - значит его не апдейть :) В (1) сбивающий с толку пример, смотри статью |
|||
9
popoff17
10.11.13
✎
20:28
|
(8) рассинхронизация: вся номенклатура отслеживается же по коду (в 1с) и по ID (в mysql). Чтобы они были одинаковыми и в йс и в бд. Дело то вот в чем:
В бд id имеен тип int, а в 1с код имеет тип string, т.е. если в 1с 01 и 001 - это разные коды, то в mysql это один и тот же - 1. соответственно, если я циклом прохожу по всей номенклатуре, ситуация сейчас выглядит так: 01 вносится в бд, следующая итеррация........ встречаем 001, пытаемся внести в бд, получаем ошибку и цикл обрывается. Вот мне обрыва и надо избежать, а сделать чтобы при ошибке цикл переходил на следующую итеррацию, сообщив о "дубляже", чтобы его в 1с изменить уже и таки импортировать... Обратного импорта из mysql в 1с нет и не будет, так что тут без комментариев. за помощь спасибо! Я посмотрю сейчас про IGNORE, но если есть чем дополнить - буду благодарен! |
|||
10
Злой Бобр
10.11.13
✎
22:33
|
(0)(9) Фигней занимаетесь. Заведи в 1С реквизит "КодMySQL" к примеру. Настрой при вводе нового увеличивать на 1. Один раз синхронизируй и забудь.
Более того можешь завести константу или в справочник ложить последний код синхронизации. Тогда при следующей синхронизации тупо пишешь коды больше сохраненного. И запросом выбрать только новые удобней, и можно сразу пачкой вводить. Ну и т.д. Вариантов упорядочить ваш мазохизм куча. Но если так и задумано то sorry. |
|||
11
КонецЦикла
10.11.13
✎
22:35
|
(9) Непреодолимое препятствие, конечно :)))
Хорошо что в MySQL не двоичные данные... |
|||
12
kokamoonga
10.11.13
✎
23:13
|
(9) вот после такого описания весь предыдущий тред можно смело игнорировать.
у тебя очевидно проблема не с кодом и не с технологией, а с дизайном приложения. либо слушай (10), либо обратный вариант синхронизироваться по коду из 1С, то есть доп. колонку в базе MySql. чтобы избежать глупостей с преобразованием типов и прочим. Я для себя в свое время принял, что наиболее вменяемый способ синхронизации - по артикулу. Это уникальный реквизит и в мускуле и в 1с. Он не зависит от автоинкрементов и прочих особенностей платформ, ибо это строка букв и цифр из реального мира, привязанная к конкретному товару. |
|||
13
Злой Бобр
11.11.13
✎
02:47
|
(12) Артикул вовсе не уникален. Как собственно и штрих-код. Так артикулы разных товаров могут совпасть. А на одном штрих-коде может быть один товар но например разного цвета. Так что нестоит так категорично об этом говорить.
|
|||
14
kokamoonga
11.11.13
✎
06:56
|
(13) я говорю о конкретной реализации - у себя:)
У нас артикулы уникальны. За счет преффиксов. Поскольку артикул как реквизит есть в любой или почти в любой конфигурации и также почти в любом движке интернет-магазина это всего лишь означает, что не нужно вводить лишних сущностей. Я возможно не совсем внятно выразился. Я имел в виду, что не очень удачная идея привязываться к pk из разных баз данных. Это мое субъективное мнение. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |