Проблемы с выполнением БД SQLite в Perl-скрипте

2

Итак, я новичок в Perl и не знаком с SQLite. У меня есть опыт SQL, но этот новый синтаксис Perl немного меня отбрасывает.

Итак, у меня есть проблема, когда я пытаюсь создать БД из журнала IPtable с помощью Perl script для анализа данных, которые есть в таблице, и отправки уведомлений людям. script также отправляет уведомления пользователям, но я не думаю, что это имеет какое-либо отношение к этой проблеме.

Это ошибка, которую я получаю.

DBD:: SQLite:: db prepare failed: нет такой таблицы: syslog_decom_notif в. /send _notification_syslog.pl строке 251. Невозможно вызвать метод "выполнить" по значению undefined в строке. /send _notification_syslog.pl 252.

Ниже приведен код, в котором я получаю сообщение об ошибке:

2 sub select_contacts {
233         my @contact_info;
234         my $dbh = DBI->connect( DECOM_NOTIFICATION_DB ,"","");
235
236         my ( $where_clause, @exec_params ) = build_where_clause();
237
238         my $SQL = <<SQL;
239 select
240                 contact
241         ,       status
242         ,       contact_mngr
243         ,       hostname
244         ,       contact_type
245         ,       syslog_server
246 from
247         syslog_decom_notif
248 $where_clause
249 SQL
250         debug  ( __LINE__ . " Excuting SQL = \n[ $SQL ]\n" );
251         my $sth = $dbh->prepare( $SQL );
252         $sth->execute( @exec_params );
253         if ( $debug_mode ) {
254                 my @cols = @{$sth->{NAME}};
255                 print join '|', @cols;
256                 print "\n";
257         }
258         while (my @res = $sth->fetchrow) {
259                 for ( my $i=0; $i<@res; $i++ ) { $res[$i] = 'Null' if ! defined $res[$i]; }
260                 my $row = join '|', @res;
261                 debug "$row\n";
262                 push @contact_info, $row;
263         }
264         $sth->finish();
265         return @contact_info;
266 }

Я искал вокруг, и я не могу найти ничего, что могло бы действительно помочь с этой проблемой.

Я ценю любые идеи.

С наилучшими пожеланиями

  • 1
    no such table: syslog_decom_notif . Есть ли такой стол? Попробуйте выполнить запрос ( $SQL , вы уже выводите его) в командной строке клиента db. Также говорится, что вы создаете таблицу и сохраняете данные, но ваш код показывает только SELECT . Это немного странно. ;-)
  • 0
    Спасибо за ваш вклад! Я отредактировал свой пост, я хотел сказать, что данные анализируются в БД, а затем отправляются уведомления по электронной почте. Я не хотел сказать, что данные анализируются, а затем сохраняются. :-)
Теги:

1 ответ

5

Ну, простая истина заключается в том, что, как говорится, DBI не может найти таблицу с именем syslog_decom_notif в открывшейся базе данных. После того, как prepare провалился, ничего другого не будет работать.

Я предполагаю, что у вас правильное имя таблицы, поэтому я задаюсь вопросом о значении DECOM_NOTIFICATION_DB. Откуда это взялось? Возможно, это строка, определенная с помощью use constant?

В вызове connect для SQLite DBI ожидает DSN, который выглядит как dbi:SQLite:dbname=my_db_file. Если файл не существует, он будет создан, поэтому, возможно, вы неправильно настроили его и работаете с пустой базой данных?


Обновление

Чтобы узнать, что находится в базе данных, к которой вы подключились, добавьте это право после вызова DBI->connect. Он распечатает список таблиц в подключенной базе данных. Убедитесь, что терминатор END появляется в начале строки и не имеет пробелов до или после него.

my $tables = $dbh->selectcol_arrayref(<<END);
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name
END

print "$_\n" for @$tables;
  • 0
    DECOM_NOTIFICATION_DB устанавливается как константа использования в начале скрипта. Что касается соединения, о котором вы говорите, я все еще в этом разбираюсь, но я к вам вернусь.
  • 2
    Я добавил в свой ответ, чтобы показать некоторый код, который будет перечислять таблицы в базе данных SQLite, к которой вы подключились.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню