Модуль позволяет работать одновременно с разными базами данных, но в большинстве случаев используется одно соединение. Это соединение глобальное в рамках NoDeny и к нему можно обращаться по имени Db, а не через переменную:
Db->do('DELETE FROM tbl WHERE 0');
Основные методы:
Метод do наиболее простой. Возращает количество строк, которые были успешно обновлены или удалены. Если запрос не будет выполнен, например, он ошибочен - будет возвращено число -1 (минус один):
my $rows = Db->do('DELETE FROM tbl WHERE 0'); $rows < 1 && Error 'Запрос не выполнен. Либо ошибочный sql либо условию соответствует 0 строк';
Метод sql обычно используется для SELECT запросов:
my $db = Db->sql("SELECT id, name FROM users"); $db->ok or Error 'Запрос не был выполнен!'; while( my %p = $db->line ) { debug("$p{id} = $p{name}"); }
Метод ok возвращает ненулевое число, если последний sql был выполнен успешно. При этом, причина может быть вовсе не в неправильном sql, а, например, в дисконнекте БД либо повреждении таблицы. Обычно программисты игнорируют такого рода ошибки, что приводит к очень долгому и нудному выявлению причины внезапной неработоспособности продукта. Да, вероятность дисконнекта mysql на localhost низка, повреждения таблицы - тоже, у вас же все надежно? Но не забывайте, что вы пишете код не только для себя, да и рано или поздно вдруг вы допустите переполнение диска?
В приведенном выше примере, в результате выполнения sql мы получили объект $db, который хранит результат, в нашем случае все строки таблицы users. Из этого результата мы последовательно получаем последующую строку методом line. Метод line может применяться не только к результату, но и использоваться в случае, когда мы гарантированно выбираем одну строку:
my %p = Db->line("SELECT COUNT(*) AS n FROM users"); Db->ok or Error 'Количество клиентов не получено: sql не был выполнен!'; debug('Всего клиентов в базе:', $p{n});
Крайне рекомендуется динамические параметры вставлять в sql как плейсхолдеры:
my $db = Db->sql("SELECT * FROM users WHERE name=? AND fio=?", $name, $fio);
Это эквивалент "SELECT * FROM users WHERE name=$name AND fio=$fio", при этом в $name и $fio будут автоматически экранированы символы, которые могут привести к sql инъекциям или просто к невыполнению sql.
Метод sql имеет альтернативный расширенный формат вызова:
my $db = Db->sql( sql => "SELECT * FROM tbl WHERE field=? AND val=?", param => [ $filed, $val ], comment => 'Выбираем опасных абонентов', ); while( my %p = $db->line ) { ... }