Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите как подавить вывод ошибки, dbi: INSERT INTO 
V
    Опции темы
vax1700
Дата 20.3.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



У меня есть таблица с полем 'word', на котором стоит UNIQUE индекс.
При работе скрипта я вставляю в таблицу слова. При дублировании слова мне нужно засечь факт дублирования.

Это я реализовал так:
Код
$dbh->do("INSERT INTO ... VALUES ....", { PrintError => 0, RaiseError => 0 } );

if ( $dbh->errstr() )
{
...
}

но при вставке одинакового слова вылетает фатальная ошибка (см. вложение)
Скажите как её подавить?

P.S. INSERT IGNORE делать не могу, т.к. не засеку факт дублирования.
Как видите выше пробовал применит %attr ( и в do и в connect), но не получается.
Кто сталкивался с подобной проблемой?

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  error.JPG 7,10 Kb
PM MAIL   Вверх
BlackLFL
Дата 20.3.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



Код

my $rv = $dbh->do("...");
unless ( $rv ) {
    print DBI->errstr;
}


Это сообщение отредактировал(а) BlackLFL - 20.3.2006, 19:10
PM WWW   Вверх
vax1700
Дата 20.3.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



так у меня exception вылетает на $dbh->do!
и дальше не продолжает. Обрывает.

Это сообщение отредактировал(а) vax1700 - 20.3.2006, 20:23
PM MAIL   Вверх
BlackLFL
Дата 20.3.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



значит у Вас где-то стоит перехватчик ошибок, например, если ошибка выводится на
экран, это может происходить из-за подключенного модуля CGI::Carp:
Код

use CGI::Carp qw(fatalsToBrowser);


Это сообщение отредактировал(а) BlackLFL - 20.3.2006, 20:59
PM WWW   Вверх
vax1700
Дата 20.3.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



BlackLFL, Нет, ничего нет
ок, спасибо, может ещё кто-нибудь подскажет?
Я так думаю, что в $dbh->do надо какой-то специальный флаг передавать, чтобы мускуловские ошибки не были фатальными для $dbh->do.
PM MAIL   Вверх
igorold
Дата 21.3.2006, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 3
Всего: 17



А если до добавления слова делать запрос на проверку, что это слово уже есть в базе?
Код

SELECT word FROM table WHERE word='value'

если запрос окажется пустой, до делать insert

Это сообщение отредактировал(а) igorold - 21.3.2006, 10:17


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Ivan Kolesnikov
Дата 21.3.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



По моему, ты не в том месте используешь PrintError, по крайней мере у меня с Oracle твой пример тоже выдает сообщение на консоль.
Попробуй вот так:
Код

use DBI;
use strict;
my $dbh = DBI->connect($connect, $user, $password, {PrintError => 0});
$dbh->do("insert into ...") or print "Can not insert\n";

--------------------
PM MAIL ICQ   Вверх
sharq
Дата 21.3.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



smile читаем внимательно perldoc DBI.


vax1700,
Цитата(vax1700 @ 20.3.2006, 19:54 Найти цитируемый пост)
$dbh->do("INSERT INTO ... VALUES ....", { PrintError => 0, RaiseError => 0 } );


Цитата(Ivan Kolesnikov @ 21.3.2006, 11:09 Найти цитируемый пост)
По моему, ты не в том месте используешь PrintError

smile

В do тоже можно, есть поле \%attr. Но лучше инициализировать аттрибуты в connect! Один раз и для всех методов!

Только
Код

use strict;
use DBI;
my $dbh = DBI->connect("dbi:mysql:database@localhost", $user, $password, {RaiseError => 0, PrintError => 0}); # отключение Raise!
$dbh->do("insert into ..."); # здесь можно ловить ошибки, если не ловить - то никаких ошибок не будет и ты не узнаешь, о выполнение команды.



Цитата(Ivan Kolesnikov @ 21.3.2006, 11:09 Найти цитируемый пост)
пример тоже выдает сообщение на консоль.

в STDOUT и у него тоже, только IDE перехватывает.

vax1700,
Цитата(vax1700 @ 21.3.2006, 00:20 Найти цитируемый пост)
Я так думаю, что в $dbh->do надо какой-то специальный флаг передавать, чтобы мускуловские ошибки не были фатальными для $dbh->do.

Нет, не надо! СУБД правильно ругается, ты - как разработчик должен предусмотреть такую ситуацию, раз в бд у тебя поле уникальное, чтобы не было duplicate!
Делаешь выборку, если такой записи нет, то вставляешь, если есть, то выводишь сообщение пользователю или дальше.

Лично я всегда использую {RaiseError =>1, PrintError => 1} и всем тоже советую!

smile

Это сообщение отредактировал(а) sharq - 21.3.2006, 12:28


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Ivan Kolesnikov
Дата 21.3.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



Перед тем как писать я прочитал perldoc smile
Но все равно, если указать {PrintError=>0} в do(), то ошибка выводится, а если в connect, то нет. Может я что-то не понимаю?

Это сообщение отредактировал(а) Ivan Kolesnikov - 21.3.2006, 12:44
--------------------
PM MAIL ICQ   Вверх
vax1700
Дата 21.3.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Цитата(Ivan Kolesnikov @ 21.3.2006, 10:09 Найти цитируемый пост)
Попробуй вот так:

В DBI->connect() я тоже пробовал.
PrintError => 0 работает. Но работает каким образом? Он просто глушит вывод (только визуальный вывод) ошибок, но прерывание выполнения скрипта при этом всё-равно остаётся.
Я думал, что это может быть из-за IDE, запустил вот так:
Цитата
perl xxx.pl

И мне опять в консоли вывелись все эти "duplicate key" и скрипт прервался.
Цитата
# здесь можно ловить ошибки, если не ловить - то никаких ошибок не будет и ты не узнаешь, о выполнение команды.

Вот именно что у меня прерывается! Я даже DBI обновлял, всё-равно выводит ошибки и прерывается.
Цитата
Нет, не надо! СУБД правильно ругается, ты - как разработчик должен предусмотреть такую ситуацию, раз в бд у тебя поле уникальное, чтобы не было duplicate!

Дело в том, что это часть алгоритма.
Поясню: у меня в таблице список слов (уникальный список). Мне нужно добавлять слово.
Перед добавлением я должен узнать, а нет ли там его такого уже.
Я могу просто сначала сделать SELECT, а потом если он ничего не выберет, сделаю INSERT.
Однако каждый раз делать - SELECT - это сильно жирно. Тем более когда таблица большая.

Поэтому я выбрал другую стратегию: я вставляю слово сразу, если вставка вернёт ошибку, только тогда я делаю SELECT. А если нет, значит это новое слово.
Итого мы имеем, что для новых слов мы экономим очень ёмкий запрос.

Цитата
Но все равно, если указать {PrintError=>0} в do(), то ошибка выводится, а если в connect, то нет. Может я что-то не понимаю?

Вообщем-то мне даже всё-равно выводится она или нет. Дело не в выводе, а в том, что выполнение скрипта обраывается выдачей фатальной ошибки. И RaiseError => 0 не помогает smile

Это сообщение отредактировал(а) vax1700 - 21.3.2006, 13:27
PM MAIL   Вверх
Ivan Kolesnikov
Дата 21.3.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



Код

use DBI;
use strict;
my $dbh = DBI->connect('connect', 'user', 'password', {PrintError => 0, RaiseError => 0});
$dbh->do("insert into...") or print "Can not insert\n";
print "OK";

У меня нормально работает, вне зависимости была ошибка или нет, выводится "OK"
--------------------
PM MAIL ICQ   Вверх
vax1700
Дата 21.3.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Ivan Kolesnikov,
А какую вы ошибку пробовали допустить?
У меня не получается на дублирование UNIQUE ключа.
Вы такую же ситуацию воспроизвели?
PM MAIL   Вверх
Ivan Kolesnikov
Дата 21.3.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



Да, но вот только у меня база не Mysql, а Oracle, сейчас проверю на mysql и сообщу свои результаты
--------------------
PM MAIL ICQ   Вверх
vax1700
Дата 21.3.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Прошу прощения, но по-моему наболомутил я.
Прерывается на regexp'е.....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.5269 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.