четверг, 14 июня 2012 г.

Работа с Mysql в Perl (модуль Mysql)

Очень часто приходиться писать различные скрипты на perl.
Большинство скриптов берет или пишет какие либо данные в БД.
Самой популярной БД является MySql, поэтому я опишу основные моменты, как это делать в perl.
Примечание: используемая ОС - Gentoo, но справедливо для любой Linux или *BSD системы.


Необходимые компоненты:

  • Собственно сам Perl. Ставится просто:
    
    # emerge perl
    
  • А также необходимые модули. Проще всего ставить через CPAN.
    Главный модуль, который нам нужен - это Mysql.
    Он же, в свою очередь требует включения DBI и DBD::mysql.
    Модуль YAML (аналог XML) нужен для большинства модулей
    Можно либо ставить каждый модуль отдельно следующим образом:
    
    #perl -MCPAN -e'install YAML' 
    #perl -MCPAN -e'install DBD::mysql' 
    #perl -MCPAN -e'install DBI'
    #perl -MCPAN -e'install Mysql'
    
     или получить shell и выполнить в интерактивном режиме установку в нем
    #perl -MCPAN -e shell
    >install YAML
    >install DBD::mysql
    >install DBI
    >install Mysql
    
    Примечание: Возможно понадобится использовать "force install [module]". Все модули должны ставиться под root либо пользователя с соответствующими правами. Рабочая папка для сборки библиотек - ~/.cpan. 
  •  Если у Вас выбиват при запуске программы ошибку
    
    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)

Комментариев нет:

Отправить комментарий