![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| vax1700 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
У меня есть таблица с полем 'word', на котором стоит UNIQUE индекс.
При работе скрипта я вставляю в таблицу слова. При дублировании слова мне нужно засечь факт дублирования. Это я реализовал так:
но при вставке одинакового слова вылетает фатальная ошибка (см. вложение) Скажите как её подавить? P.S. INSERT IGNORE делать не могу, т.к. не засеку факт дублирования. Как видите выше пробовал применит %attr ( и в do и в connect), но не получается. Кто сталкивался с подобной проблемой? Присоединённый файл ( Кол-во скачиваний: 17 )
error.JPG 7,10 Kb |
|||
|
||||
| BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
Это сообщение отредактировал(а) BlackLFL - 20.3.2006, 19:10 |
|||
|
||||
| vax1700 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
так у меня exception вылетает на $dbh->do!
и дальше не продолжает. Обрывает. Это сообщение отредактировал(а) vax1700 - 20.3.2006, 20:23 |
|||
|
||||
| BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
значит у Вас где-то стоит перехватчик ошибок, например, если ошибка выводится на
экран, это может происходить из-за подключенного модуля CGI::Carp:
Это сообщение отредактировал(а) BlackLFL - 20.3.2006, 20:59 |
|||
|
||||
| vax1700 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
BlackLFL, Нет, ничего нет
ок, спасибо, может ещё кто-нибудь подскажет? Я так думаю, что в $dbh->do надо какой-то специальный флаг передавать, чтобы мускуловские ошибки не были фатальными для $dbh->do. |
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 3 Всего: 17 |
А если до добавления слова делать запрос на проверку, что это слово уже есть в базе?
если запрос окажется пустой, до делать insert Это сообщение отредактировал(а) igorold - 21.3.2006, 10:17 -------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| Ivan Kolesnikov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: 3 Всего: 6 |
По моему, ты не в том месте используешь PrintError, по крайней мере у меня с Oracle твой пример тоже выдает сообщение на консоль.
Попробуй вот так:
--------------------
|
|||
|
||||
| sharq |
|
||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
vax1700,
В do тоже можно, есть поле \%attr. Но лучше инициализировать аттрибуты в connect! Один раз и для всех методов! Только
в STDOUT и у него тоже, только IDE перехватывает. vax1700,
Нет, не надо! СУБД правильно ругается, ты - как разработчик должен предусмотреть такую ситуацию, раз в бд у тебя поле уникальное, чтобы не было duplicate! Делаешь выборку, если такой записи нет, то вставляешь, если есть, то выводишь сообщение пользователю или дальше. Лично я всегда использую {RaiseError =>1, PrintError => 1} и всем тоже советую! Это сообщение отредактировал(а) sharq - 21.3.2006, 12:28 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||
|
|||||||
| Ivan Kolesnikov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: 3 Всего: 6 |
Перед тем как писать я прочитал perldoc
Но все равно, если указать {PrintError=>0} в do(), то ошибка выводится, а если в connect, то нет. Может я что-то не понимаю? Это сообщение отредактировал(а) Ivan Kolesnikov - 21.3.2006, 12:44 --------------------
|
|||
|
||||
| vax1700 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
В DBI->connect() я тоже пробовал. PrintError => 0 работает. Но работает каким образом? Он просто глушит вывод (только визуальный вывод) ошибок, но прерывание выполнения скрипта при этом всё-равно остаётся. Я думал, что это может быть из-за IDE, запустил вот так:
И мне опять в консоли вывелись все эти "duplicate key" и скрипт прервался.
Вот именно что у меня прерывается! Я даже DBI обновлял, всё-равно выводит ошибки и прерывается.
Дело в том, что это часть алгоритма. Поясню: у меня в таблице список слов (уникальный список). Мне нужно добавлять слово. Перед добавлением я должен узнать, а нет ли там его такого уже. Я могу просто сначала сделать SELECT, а потом если он ничего не выберет, сделаю INSERT. Однако каждый раз делать - SELECT - это сильно жирно. Тем более когда таблица большая. Поэтому я выбрал другую стратегию: я вставляю слово сразу, если вставка вернёт ошибку, только тогда я делаю SELECT. А если нет, значит это новое слово. Итого мы имеем, что для новых слов мы экономим очень ёмкий запрос.
Вообщем-то мне даже всё-равно выводится она или нет. Дело не в выводе, а в том, что выполнение скрипта обраывается выдачей фатальной ошибки. И RaiseError => 0 не помогает Это сообщение отредактировал(а) vax1700 - 21.3.2006, 13:27 |
||||||||
|
|||||||||
| Ivan Kolesnikov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: 3 Всего: 6 |
У меня нормально работает, вне зависимости была ошибка или нет, выводится "OK" --------------------
|
|||
|
||||
| vax1700 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Ivan Kolesnikov,
А какую вы ошибку пробовали допустить? У меня не получается на дублирование UNIQUE ключа. Вы такую же ситуацию воспроизвели? |
|||
|
||||
| Ivan Kolesnikov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: 3 Всего: 6 |
Да, но вот только у меня база не Mysql, а Oracle, сейчас проверю на mysql и сообщу свои результаты
--------------------
|
|||
|
||||
| vax1700 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Прошу прощения, но по-моему наболомутил я.
Прерывается на regexp'е..... |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |