Очень часто приходиться писать различные скрипты на perl.
Большинство скриптов берет или пишет какие либо данные в БД.
Самой популярной БД является MySql, поэтому я опишу основные моменты, как это делать в perl.
Примечание: используемая ОС - Gentoo, но справедливо для любой Linux или *BSD системы.
Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность.
Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться.
Возвращается дескриптор базы данных, если команда Connect выполнена успешно.
В противном случае возвращаемое значение не определено.
Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host.
А вообще библиотека потоков MIT такое глюкало...
Можно указать имя пользователя и пароль.
Если имя пользователя не указано, используется текущий логин.
Если не указан пароль, а пользователь его имеет, связь установить не получится.
Возвращаемый дескриптор нужен для обращения к базе данных.
Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, ...)
Из полученного дескриптора можно извлечь сведения о имени сервера, порте и имени базы данных:
СИНТАКСИС:
Если база данных не выбрана в команде Connect, или если нужно связаться с другой базой данных, то используется дескриптор базы данных из предыдущего вызова команды Connect. Он используется командой SelectDB.
СИНТАКСИС:
ОПИСАНИЕ:
ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.
ПРИМЕР:
СИНТАКСИС:
ОПИСАНИЕ:
Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.
ПРИМЕР:
СИНТАКСИС:
ОПИСАНИЕ:
ListFields возвращает операторный дескриптор, который может использоваться, чтобы выяснить, что именно сервер должен Вам передать. В случае ошибки возвращаемое значение не определено.
MySQL ListFields не работает так же как mSQL ListFields. В MySQL Вы используете следующие команды, чтобы получить информацию после вызова ListFields.
Перед использованием следующих функций, Вы должны выполнить успешное обращение к ListFields.
@arr = @{$sth->name}; Возвращает массив имен столбцов
@arr = @{$sth->length}; Возвращает массив длин столбцов
$value = $sth->numfields; Возвращает количество столбцов в таблице
@arr = @{$sth->type}; Массив MySQL типов
@arr = @{$sth->is_num}; Массив 0 и 1, где 1 указывает что столбец числовой
@arr = @{$sth->is_blob}; Массив 0 и 1, где 1 указывает что столбец - blob
@arr = @{$sth->is_not_null}; Массив 0 и 1, где 1 указывает что столбец - не NULL
СИНТАКСИС:
ОПИСАНИЕ:
Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.
ПРИМЕР:
СИНТАКСИС:
Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.
Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.
СИНТАКСИС:
ОПИСАНИЕ:
Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.
СИНТАКСИС:
Возвращает массив значений следующей строки, полученной с сервера.
Пример
Выводит описание структуры таблицы TABLE_NAME
СИНТАКСИС:
Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).
Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.
СИНТАКСИС:
ОПИСАНИЕ:
Конвертирует строку: пропускает все символы ' и \, а также конвертирует \0 и \n.
Всякий раз, когда обработчик, который обеспечивает доступ к базе данных, обрабатывает потерянное значение, Mysql выбирает соответствующее действие (освобождает результат или закрывает подключение к базе данных).
Так, если Вы хотите освободить результат или закрыть подключение, Вы можете делать одно из следующих действий:
Теперь пересмотрим вышеупомянутые методы в отношении метаданных.
Дескриптор базы данных
Как упомянуто выше, Вы получаете дескриптор базы данных с помощью:
Ссылки:
Интерфейс с perl (MySQL perl API)_ресурс_Mysql.ru_
Perl + mySQL (драйвер Mysql)
Большинство скриптов берет или пишет какие либо данные в БД.
Самой популярной БД является MySql, поэтому я опишу основные моменты, как это делать в perl.
Примечание: используемая ОС - Gentoo, но справедливо для любой Linux или *BSD системы.
Необходимые компоненты:
- Собственно сам Perl.
Ставится просто:
# emerge perl
- А также необходимые модули. Проще всего ставить через CPAN.
Главный модуль, который нам нужен - это Mysql.
Он же, в свою очередь требует включения DBI и DBD::mysql.
Модуль YAML (аналог XML) нужен для большинства модулей
Можно либо ставить каждый модуль отдельно следующим образом:
или получить shell и выполнить в интерактивном режиме установку в нем#perl -MCPAN -e'install YAML' #perl -MCPAN -e'install DBD::mysql' #perl -MCPAN -e'install DBI' #perl -MCPAN -e'install Mysql'
Примечание: Возможно понадобится использовать "force install [module]". Все модули должны ставиться под root либо пользователя с соответствующими правами. Рабочая папка для сборки библиотек - ~/.cpan.#perl -MCPAN -e shell >install YAML >install DBD::mysql >install DBI >install Mysql
- Если у Вас выбиват при запуске программы ошибку
то нужно сделатьCan't locate MySQL.pm in @INC
force install Bundle::Mysql
Подключение модуля:
Подключение модуля Mysql в теле Вашей программы:
#!/usr/bin/perl
use Mysql;
Connect
$dbh = Mysql->Connect;
$dbh = Mysql->Connect($host);
$dbh = Mysql->Connect($host,$database);
$dbh = Mysql->Connect($host,$database,$password);
$dbh = Mysql->Connect($host,$database,$password,$user);
Эта команда устанавливает соединение с сервером и базой данных. Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность.
Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться.
Возвращается дескриптор базы данных, если команда Connect выполнена успешно.
В противном случае возвращаемое значение не определено.
Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host.
А вообще библиотека потоков MIT такое глюкало...
Можно указать имя пользователя и пароль.
Если имя пользователя не указано, используется текущий логин.
Если не указан пароль, а пользователь его имеет, связь установить не получится.
Возвращаемый дескриптор нужен для обращения к базе данных.
Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, ...)
Из полученного дескриптора можно извлечь сведения о имени сервера, порте и имени базы данных:
$scalar = $dbh->sock;
$scalar = $dbh->host;
$scalar = $dbh->database;
Имя базы данных не определено, если при вызове команды Connect было указано только имя сервера.
Смена порта
Сменить порт, к которому присоединился MysqlPerl можно так:
$ENV{"MYSQL_TCP_PORT"}=3334;
$ENV{"MYSQL_UNIX_PORT"}="/tmp/mysql_new.sock";
use Mysql;
$dbh = Mysql->Connect($host);
SelectDB
Выбор базы данных для использования.СИНТАКСИС:
$dbh->SelectDB($database);
ОПИСАНИЕ:
Если база данных не выбрана в команде Connect, или если нужно связаться с другой базой данных, то используется дескриптор базы данных из предыдущего вызова команды Connect. Он используется командой SelectDB.
ListDBs
Список доступных баз данных.СИНТАКСИС:
@arr = $dbh->ListDBs;
ОПИСАНИЕ:
ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.
ПРИМЕР:
@dbs = $dbh->ListDBs; # Возвращает массив имен баз данных.
$count = $#dbs; # Вычисляет сколько элементов.
for ($i=0;$i<=$count;$i++) {
print(" ".$dbs[$i]."\n");
}
ListTables
Список таблиц, доступных в базе данных.СИНТАКСИС:
@arr = $dbh->ListTables;
ОПИСАНИЕ:
Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.
ПРИМЕР:
@tables = $dbh->ListTables; # Assumes that $dbh points
# to a valid database
$count = $#tables; # Figure out how many elements.
for ($i=0;$i<=$count;$i++) { # Print out the table names.
print(" ".$tables[$i]."\n");
}
ListFields
Список полей в таблице.СИНТАКСИС:
$sth = ListFields $dbh $table;
ОПИСАНИЕ:
ListFields возвращает операторный дескриптор, который может использоваться, чтобы выяснить, что именно сервер должен Вам передать. В случае ошибки возвращаемое значение не определено.
MySQL ListFields не работает так же как mSQL ListFields. В MySQL Вы используете следующие команды, чтобы получить информацию после вызова ListFields.
Перед использованием следующих функций, Вы должны выполнить успешное обращение к ListFields.
@arr = @{$sth->name}; Возвращает массив имен столбцов
@arr = @{$sth->length}; Возвращает массив длин столбцов
$value = $sth->numfields; Возвращает количество столбцов в таблице
@arr = @{$sth->type}; Массив MySQL типов
@arr = @{$sth->is_num}; Массив 0 и 1, где 1 указывает что столбец числовой
@arr = @{$sth->is_blob}; Массив 0 и 1, где 1 указывает что столбец - blob
@arr = @{$sth->is_not_null}; Массив 0 и 1, где 1 указывает что столбец - не NULL
Query
Выполнить запрос.СИНТАКСИС:
$sth = $dbh->Query($sql_statement);
ОПИСАНИЕ:
Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.
ПРИМЕР:
$sth = $dbh->Query("SELECT * FROM Widget_Table
WHERE widget_id = 1") or die $Mysql::db_errstr;
$foo = $record[0];
$bar = $record[1];
}
Хорошая идея - всегда проверить ошибки. В этом примере такой проверкой занимается блок "or die..." оператора Query.
FetchCol
Возвращает массив, содержащий один столбец, состоящий из значений.СИНТАКСИС:
@arr = $sth->FetchCol($col);
ОПИСАНИЕ:Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.
Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.
FetchHash
Возвращает результат запроса.СИНТАКСИС:
%hash = $sth->FetchHash;
ОПИСАНИЕ:
Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.
FetchRow
Возвращает строку результатов.СИНТАКСИС:
@arr = $sth->FetchRow;
ОПИСАНИЕ:Возвращает массив значений следующей строки, полученной с сервера.
Пример
Выводит описание структуры таблицы TABLE_NAME
$q_str="DESC TABLE_NAME";
$sth=$dbh->Query($q_str) or die $Mysql::db_errstr;
while (@row = $sth->FetchRow)
{
$size_row=@row;
$str="";
for ($i=0; $i<= $size_row; $i++)
{
$str=$str." ".$row[$i];
}
$str=$str."\n";
print "$str";
}
DataSeek
Позиционируется на произвольную позицию в данных.СИНТАКСИС:
DataSeek $sth $row_number;
ОПИСАНИЕ:Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).
Обработка двоичных строк
Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.
СИНТАКСИС:
$scaler = $dbh->quote($binary_string)
ОПИСАНИЕ:
Конвертирует строку: пропускает все символы ' и \, а также конвертирует \0 и \n.
Потерянные значения
Всякий раз, когда обработчик, который обеспечивает доступ к базе данных, обрабатывает потерянное значение, Mysql выбирает соответствующее действие (освобождает результат или закрывает подключение к базе данных).
Так, если Вы хотите освободить результат или закрыть подключение, Вы можете делать одно из следующих действий:
- Разопределить дескриптор
- Использовать дескриптор для другой цели
- Использовать дескриптор внутри блока и объявите его с my()
- Выйдите из программы
Теперь пересмотрим вышеупомянутые методы в отношении метаданных.
Дескриптор базы данных
Как упомянуто выше, Вы получаете дескриптор базы данных с помощью:
$dbh = Connect Mysql $host, $database;
Дескриптор базы данных хранит сведения о хост-имени сервера, его порте и имени базы данных, с которой установлена связь. Эти три значения можно получить так:
$scalar = $dbh->sock;
$scalar = $dbh->host;
$scalar = $dbh->database;
База данных не определена, если связь установлена без аргументов или только с одним аргументом.
Операторный дескриптор
Два конструктора возвращают операторный дескриптор:$sth = ListFields $dbh $table;
$sth = Query $dbh $sql_statement;
$sth хранит все метаданные, предоставляемые API:
$scalar = $sth->affected_rows; Сколько записей вставлено или изменено.
$scalar = $sth->info; Статистика о предыдущих запросах ALTER TABLE или LOAD DATA FROM INFILE.
$arrref = $sth->is_blob; Массив битов, специфицирующих является ли данное поле BLOB.
$arrref = $sth->is_not_null; Массив битов, специфицирующих является ли данное поле NULL.
$arrref = $sth->is_pri_key; Массив битов, специфицирующих является ли данное поле первичным ключом.
$arrref = $sth->is_num; Массив битов, специфицирующих является ли данное поле числом.
$scalar = $sth->insert_id; Значение, присвоенное столбцу с помощью AUTO_INCREMENT последним INSERT.
$arrref = $sth->length; Массив длин всех полей в байтах.
$arrref = $sth->name; Имена всех столбцов.
$scalar = $sth->numrows; Количество возвращаемых записей.
$scalar = $sth->numfields; Количество возвращаемых полей.
$arrref = $sth->table; Имена каждого столбца в таблице.
$arrref = $sth->type; Тип каждого столбца, определен в mysql.h. Доступен с помощью &Mysql::CHAR_TYPE, &Mysql::INT_TYPE, &Mysql::REAL_TYPE
Ссылки:
Интерфейс с perl (MySQL perl API)_ресурс_Mysql.ru_
Perl + mySQL (драйвер Mysql)
Комментариев нет:
Отправить комментарий