Date: Mon, 23 Oct 2000 12:18:57 +0400 (MSD)
From: MailList: Perl в примерах
Subject: Perl DBI
Perl DBI
Николай Матковский (matkovsky@ukrpost.net)
Эта статья послужит вам справочником по интерфейсу Perl BDI. DBI
является унифицированным интерфейсом для доступа к базам данных вне
зависимости от типа СУБД. Это означает, что используя DBI вы можете
написать скрипт, который будет без всяких изменений работать на
различных платформах с различными СУБД.
Для использования DBI вам нужно вставить в скрипт строку:
use DBI;
Методы DBI
connect connect ($источник_данных, $имя, $пароль)
Устанавливает соединение с указанным сервером. Строка $источник_данных
должна начитаться с 'DBI:название_драйвера:'.
Возвращаемое значение - указатель на базу данных, далее используемый
для работы с этой базой.
disconnect Разрывает соединение с СУБД. Как правило выполняется в
конце выполнения программы или когда соединение больше ше нужно.
$dbh->disconnect
prepare Подготавливает SQL-запрос к выполнению. Принцип работы с
SQL-запросами в этом модуле заключается в подготовке и последующего
выполнения запроса.
$sth = $dbh->prepare("SELECT * FROM SOME_TABLE");
Возвращаемое значение - это идентификатор запроса. Позже это значение
может быть использовано для получения результатов выполнения запросов.
execute Выполняет запрос, подготовленный ранее методом prepare.
$rv = $sth->execute;
Возвращаемое значение - это количество строк, подвергшихся изменению.
do Этот метод выполняет всю работу последних двух - prepare и execute
самостоятельно.
$rv = $dbh->do("SELECT * FROM SOME_TABLE");
fetchrow_... Следующие четыре функции предназначены для получения
результатов выполнения запросов.
@row = $sth->fetchrow_array. Этот метод возвращает следующую строку
результата в виде массива начений. Понятно, что для извлечения всех
данных следует поместить его вызов в цикл.
$row_ref = $sth->fetchrow_arrayref. Этот метод делает то же самое, за
исключением того, что возвращает не массив, а указательна массив.
$hash_ref = $sth->fetchrow_hashref. Аналогично последнему возвращает
указатель, но не на массив, а на ассоциативный массив, ключами
которого являются названия полей таблицы, а значениями -
соответствующие значения в строке.
$table = $sth->fetchall_arrayref. Последний из методов служит для
извлечения всех данных за один раз - возвращает указатель на массив,
элементами которого являются указатели на строки.
finish finish указывает на то, что никакие данные больше не будут
востребованы из набора полученного данным указателем на выражение
(statement handle). Как правило, этот метод служит для освобождения
системных ресурсов, выделеных на указатель.
$sth->finish()
rows Возвращает количество строк, подвергшихся изменению во время
выполнения последнего запроса. Как правило, этим методом пользуются
после запроса, отличного от SELECT.
$rows_affected = $sth->rows()
NUM_OF_FIELDS Это не метод, а атрибут класса, показывающий, сколько
полей содержит результат, полученный после выполнения последнего
запроса SELECT.
$num_of_fields = $sth->{NUM_OF_FIELDS}
Этих общих методов вполне достаточно, чтобы эффективно использовать
MySQL в программах, тем не менее в модуде DBI::mysql также реализованы
методы, специфические для MySQL. Они перечислены ниже.
is_... Серия функций is_... предназначена для определения
характеристик полей результата. Каждая их них возвращает указатель на
массив булевых значений, каждое из которых указывает, обладает ли
данное поле определенным свойством.
is_blob - определение полей blob
is_key - определение ключевых полей
is_num - определение полей с данными числовых типов
is_pri_key - определение полей - первичных ключей
is_not_null - определение полей, значения которых не могут принимать
значение NULL
$not_null = $sth->is_not_null()
length, max_length Аналогично предыдущим функциям, length и max_length
возвращают массивы с максимально возможными размерами полей (length)и
максимальными длинами представленых в полях данных (max_length).
@possible_max_lengths = $sth->{length};
@actual_max_lengths = $sth->{max_length};
NAME Этот атрибут содержит указательна массив с названиями всех полей,
представленых в результате.
$names = $sth->{NAME}
type Аналогично предыдущему, содержит указытель на массив, содержащий
типы полей, представленых в результате.
$types = $sth->{type}
Пример
#!/usr/bin/perl
use DBI;
$dbh = DBI->connect("DBI:mysql:test_database", "mysql_user","mysql_password")
or die "Error connecting to database";
$statement = "SELECT LASTNAME FROM names WHERE FIRSTNAME = 'Bob' LIMIT 1;";
$rv = $dbh->do($statement);
goto DISCONN if $rv eq '0E0'; # записей с именем Bob не найдено
$statement = "SELECT BIRTHDAY, ADDRESS FROM personal WHERE NAME = 'Nataly';";
$sth = $dbh->prepare($statement);
$rv = $sth->execute;
@row = $sth->fetchrow_array;
$rc = $sth->finish; # освобождаем память
print "Birthday: $row[0]n";
print "Address: $row[1]n";
$rc = $dbh->disconnect;