Базы данных и perl


Содержание

Perl и огромные базы данных, как искать и хранить?

1 Gordon [2010-09-10 20:03:00]

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

Мне, вероятно, дадут базу данных формата csv, которая будет иметь минимум 36 миллионов строк данных. В будущем пользователям нужно будет искать эту «базу данных» через интерфейс CGI/perl на основе некоторых условий в зависимости от нескольких значений столбца и отображения соответствующих строк.

Как я должен использовать perl, чтобы прочитать формат csv (возможно, используя парсер CSV из CPAN) и сохранить в какой тип базы данных? Ключевым приоритетом будет скорость поиска базы данных.

Любое кодирование образца оценивалось бы

6 ответов

6 Решение CanSpice [2010-09-10 20:10:00]

Вероятно, вы захотите найти подходящее решение для базы данных. Легче всего настроить (в зависимости от вашего знакомства с RDBMS), вероятно, MySQL. После того, как вы настроили эту настройку, вы хотите изучить модули Perl для взаимодействия с базой данных. DBIx::Class является «вещью» в наши дни, и поэтому многие люди используют его, кто может отвечать на вопросы.

О, и для вашего синтаксического анализа CSV посмотрите Text::CSV , если вы не хотите загружать его непосредственно в базу данных (и если ваши РСУБД по выбору не поддерживают прямое использование файлов CSV).

3 vol7ron [2010-09-10 20:22:00]

PostgreSQL имеет возможность импортировать CSV файлы:
http://www.postgresql.org/docs/current/static/sql-copy.html
Команда COPY также более эффективна, чем запись 36M вставок по одному за раз.

Вы должны изучить способы импорта данных после создания в СУБД. Тем не менее, с такими многочисленными записями я остался бы в стороне от MySQL .

Если данные не являются реляционными и будут только увеличиваться, вам может понадобиться использовать Hadoop или какую-либо другую форму MapReduce . Он превратит эти 30-минутные запросы в 5 минут.

2 RC. [2010-09-10 20:08:00]

Большинство баз данных будут иметь возможность непосредственно загружать CSV файл в таблицу. Например SQLLoader для Oracle или загрузить команду для MySQL.

Поиск базы данных эффективным образом будет зависеть от данных и от того, как вы хотите их искать. (то есть, какие поля будут интересны, какие из них вы можете разыграть и т.д.). Без дополнительной информации трудно дать вам солидный ответ, хотя вы должны следовать общим рекомендациям по индексированию.

Что касается примеров кода для доступа к базе данных, см. следующие ссылки:

1 daotoad [2010-09-10 20:14:00]

Сначала используйте T ext:: CSV_XS для разбора файла CSV.

Во-вторых, какая база данных для использования и как она должна быть структурирована, зависит от того, какие поисковые запросы будут сделаны.

Если вы выполняете простое сопоставление ключевых слов, то хранилище значений ключей будет очень быстрым. Что-то вроде Berkeley DB будет хорошо.

Если у вас более сложные потребности, вы можете захотеть рассмотреть базу данных SQL, такую ​​как MySQL, PostgreSQL, Oracle, SyBase и т.д. Настройка и дизайн базы данных SQL — это отдельная область исследований. Я предлагаю вам немного советов и предлагаю вам очень внимательно подумать о том, какие индексы вы можете применить к своим полям, чтобы вы могли максимизировать скорость запросов.

Oracle купила MySQL, что вызывает беспокойство, но MariaDB там, я думаю, так же хорошо, как и лучше, чем последняя mysql. Я еще не видел тестовых тестов. просто нашел его отсутствие в этой статье, так что упоминается.

Иногда Perl удивляет вашей эффективностью при обработке основных сценариев. Тем не менее, если ваши варианты использования доступны только для чтения, а информация является статичной/неизменной, я бы посмотрел, как метод грубой силы просто открывает файл и ищет его в первую очередь.

Предполагая, что это неприемлемо, вам просто нужно взглянуть на интерфейс DBI, Perl для работы с базой данных и запустить миллионы вставок один раз, а затем ваши чтения будут быстрыми с использованием современных RDBMS, таких как MySQL или SQL Server.

События базы данных и Perl

December 2020

472 раз

У меня есть сценарий Perl, который запрашивает базу данных, чтобы увидеть, если какие-либо новые строки добавлены в базу данных или нет, и если есть новая строка я хочу сделать что-то на основе значений из его столбцов. Я хочу знать, есть ли способ, чтобы не выбрать все строки в базе данных каждый раз? Есть ли что-то вроде крючка в PSQL, который может выполнять суб Perl каждый раз, когда новая строка становится доступной?

2 ответы

Есть ли что-то вроде крючка в PSQL, который может выполнять суб Perl каждый раз, когда новая строка становится доступной?

Вариант 1: PL / Perl

Вы можете использовать PL / Perl триггеры для этого.

Вы не можете запустить суб Perl из существующей программы, вам необходимо ввести процедуру PL / Perl, и он не может ссылаться на код за пределами PostgreSQL непосредственно. Что вы можете сделать , это использовать межпроцессное взаимодействие (сетевые сокеты, сигналы и т.д.) , чтобы поговорить с внешней программой. Вызов внешних команд с помощью system() из PL / Perl не отличная идея, хотя.

Вариант 2: LISTEN / NOTIFY

Есть простой PL / PgSQL триггер , который делает NOTIFY каждый раз , когда происходит изменение, либо посылая детали через уведомляют полезную нагрузку (новые Pg и DBI версии) или вставляя детали в таблицу для вашего клиента для запроса. Есть программу пребывания PL / Perl , подключенное к БД и LISTEN для этого события. Когда событие приходит, использовать Уведомлять полезную нагрузку решить , что делать, или запросить таблицу для деталей.

Поиск «слушать» и «извещать», чтобы узнать больше об этом подходе. Это, как правило, лучший выбор.

Записки *NIX Админа

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

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

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

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

  • Собственно сам Perl. Ставится просто:
  • А также необходимые модули. Проще всего ставить через CPAN.
    Главный модуль, который нам нужен — это Mysql.
    Он же, в свою очередь требует включения DBI и DBD::mysql.
    Модуль YAML (аналог XML) нужен для большинства модулей
    Можно либо ставить каждый модуль отдельно следующим образом: или получить shell и выполнить в интерактивном режиме установку в нем Примечание: Возможно понадобится использовать «force install [module]». Все модули должны ставиться под root либо пользователя с соответствующими правами. Рабочая папка для сборки библиотек —

/.cpan.

  • Если у Вас выбиват при запуске программы ошибку то нужно сделать
  • Подключение модуля:

    Connect

    Эта команда устанавливает соединение с сервером и базой данных.
    Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность.
    Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться.
    Возвращается дескриптор базы данных, если команда Connect выполнена успешно.
    В противном случае возвращаемое значение не определено.
    Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host.
    А вообще библиотека потоков MIT такое глюкало.

    Можно указать имя пользователя и пароль.
    Если имя пользователя не указано, используется текущий логин.
    Если не указан пароль, а пользователь его имеет, связь установить не получится.

    Возвращаемый дескриптор нужен для обращения к базе данных.
    Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, . )

    Из полученного дескриптора можно извлечь сведения о имени сервера, порте и имени базы данных:
    Имя базы данных не определено, если при вызове команды Connect было указано только имя сервера.

    Смена порта

    Сменить порт, к которому присоединился MysqlPerl можно так:

    SelectDB

    Выбор базы данных для использования.

    Если база данных не выбрана в команде Connect, или если нужно связаться с другой базой данных, то используется дескриптор базы данных из предыдущего вызова команды Connect. Он используется командой SelectDB.

    ListDBs

    Список доступных баз данных.
    СИНТАКСИС:

    ОПИСАНИЕ:
    ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.
    ПРИМЕР:

    ListTables

    Список таблиц, доступных в базе данных.

    ОПИСАНИЕ:
    Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.
    ПРИМЕР:

    ListFields

    Список полей в таблице.
    СИНТАКСИС:

    ОПИСАНИЕ:
    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

    Выполнить запрос.
    СИНТАКСИС:

    ОПИСАНИЕ:
    Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.

    ПРИМЕР:
    Хорошая идея — всегда проверить ошибки. В этом примере такой проверкой занимается блок «or die. » оператора Query.

    FetchCol

    Возвращает массив, содержащий один столбец, состоящий из значений.
    СИНТАКСИС:
    ОПИСАНИЕ:
    Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.

    Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.

    FetchHash

    Возвращает результат запроса.
    СИНТАКСИС:

    ОПИСАНИЕ:
    Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.

    FetchRow

    Возвращает строку результатов.
    СИНТАКСИС:
    ОПИСАНИЕ:
    Возвращает массив значений следующей строки, полученной с сервера.

    Пример
    Выводит описание структуры таблицы TABLE_NAME

    DataSeek

    Обработка двоичных строк

    Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.

    ОПИСАНИЕ:
    Конвертирует строку: пропускает все символы ‘ и \, а также конвертирует \0 и \n.

    Потерянные значения

    Операторный дескриптор

    Два конструктора возвращают операторный дескриптор:
    $sth хранит все метаданные, предоставляемые API:

    Интерфейс с perl (MySQL perl API)

    Есть два способа обращения из программы на perl к базе данных MySQL. Дело в том, что два разных человека написали в общем-то одинаково хорошие, хотя и разные библиотеки для такого доступа. Решено включить в поставку оба варианта perl API.

    Наличие perl API дает огромные возможности по доступу к базам данных MySQL из скриптов на этом языке. Учитывая, что perl очень часто используется в интернете (для написания CGI-скриптов), этот интерфейс позволяет создавать web-ориентированные базы данных.

    Этот интерфейс представляет собой первый способ обратиться к базе данных MySQL из программы на perl.

    Коротко о главном:

    Ну что, всем все ясно? Кому еще не ясно, объясняю.

    При разработке этого пакета, его старались сделать как можно более похожим на C API.

    Вы будете иметь дело с двумя классами: Mysql::Statement работаете с ним через операторный дескриптор, возвращенный командами Query или ListFields. Единственный класс, который Вы называете явно — Mysql. Это предоставляет Вам команду Connect.

    Из-за ограничений perl по обработке числовых значений, Вы будете иметь проблемы при использовании чисел больше чем signed LONG (2147483647). Это может происходить при использовании в MySQL типов данных unsigned LONG (DOUBLE) или LONGLONG (BIGINT). Perl хранит возвращаемые значения как строки, но автоматически преобразуют их в числа, когда Вы используете значения в числовом контексте. Это их усечет до 2147483647, так как perl использует тип signed LONG, чтобы хранить такие числа.

    Вы можете использовать один способ это обойти. Прежде всего всегда обрабатывайте значения, которые могут быть ОЧЕНЬ большими, как строки, а не как числа. Пока Вы делаете это, они могут отображаться и заново вставляться в базу данных без инцидентов. То же самое можно посоветовать для вставки новых значений в таблицы. Если Вы устанавливаете переменную, названную $tmpvar, равную «4147483647» и затем выполняете INSERT, чтобы вставить ее в базу данных, все будет нормально. Обратите внимание, что кавычки здесь очень важны, так как они заставляют perl обрабатывать значение как строку.

    Если Вы должны делать вычисления, включающие большие числа, то их нужно выполнять через начальный SELECT.

    Эта команда устанавливает соединение с сервером и базой данных. Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность. Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться. Возвращается дескриптор базы данных, если команда Connect выполнена успешно. В противном случае возвращаемое значение не определено. Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host. А вообще библиотека потоков MIT такое глюкало.

    Можно указать имя пользователя и пароль. Если имя пользователя не указано, используется текущий логин. Если не указан пароль, а пользователь его имеет, связь установить не получится.

    Возвращаемый дескриптор нужен для обращения к базе данных. Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, . )

    Из полученного дескриптора можно извлечь сведения о имени сервера, порте и имени базы данных:

    Имя базы данных не определено, если при вызове команды Connect было указано только имя сервера.

    Выбор базы данных для использования.

    Если база данных не выбрана в команде Connect, или если нужно связаться с другой базой данных, то используется дескриптор базы данных из предыдущего вызова команды Connect. Он используется командой SelectDB.

    Список полей в таблице.

    $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

    Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.

    Хорошая идея — всегда проверить ошибки. В этом примере такой проверкой занимается блок «or die. » оператора Query.

    Список доступных баз данных.

    ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.

    Список таблиц, доступных в базе данных.

    Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.

    Возвращает массив, содержащий один столбец, состоящий из значений.

    Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.

    Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.

    Возвращает результат запроса.

    Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.

    Возвращает строку результатов.

    Возвращает массив значений следующей строки, полученной с сервера.

    Позиционируется на произвольную позицию в данных.

    DataSeek $sth $row_number;

    Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).

    Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.

    Конвертирует строку: пропускает все символы ‘ и \, а также конвертирует \0 и \n.

    Всякий раз, когда обработчик, который обеспечивает доступ к базе данных, обрабатывает потерянное значение, Mysql выбирает соответствующее действие (освобождает результат или закрывает подключение к базе данных). Так, если Вы хотите освободить результат или закрыть подключение, Вы можете делать одно из следующих действий:

    • Разопределить дескриптор
    • Использовать дескриптор для другой цели
    • Использовать дескриптор внутри блока и объявите его с my()
    • Выйдите из программы

    Теперь пересмотрим вышеупомянутые методы в отношении метаданных.

    Как упомянуто выше, Вы получаете дескриптор базы данных с помощью:

    $dbh = Connect Mysql $host, $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

    Опция -w

    Опция -w может быть очень полезной в случае проблем с отладкой. Если Вы вызываете программу на perl с опцией -w, то предупреждения, обычно хранимые в $Mysql::db_errstr будут выводиться в STDERR (стандартный поток ошибок). Таким образом, Вы получите сообщения об ошибках сервера MySQL без обработки их в Вашей программе.

    Если надо использовать опцию -w, но не надо, чтобы сообщения об ошибках увидел демон MySQL, можно установить переменную $Mysql::QUIET в любое ненулевое значение.

    MySQL использует библиотеку libmysql.a, написанную Михаэлем Видениусом (Michael Widenius). Эта библиотека обязательно должна быть установлена до использования этого интерфейса с perl.

    Этот драйвер представляет собой второй способ обратиться к базе данных MySQL из программы на perl.

    В настоящее время эта часть описания интерфейса с perl только немного переработана, относительно версии стандартной pod-документации. Данная часть описания изготовлена с помощью команды pod2html -mke.

    DBD::mysql является драйвером для работы с базой данных, управляемой СУБД MySQL. Он портирован Michael ‘Monty’ Widenius of Alligator Descartes’ DBD::msql . Вы должны установить DBI-модуль перед использованием DBD::mysql .

    $host может быть просто именем сервера («up.botik.ru») или именем сервера с указанием порта («up.botik.ru:3333»).

    $database задает имя базы данных с которой надо связаться.

    $user задает имя пользователя для доступа к базе данных. (если не указано, используется идентификатор пользователя текущего процесса).

    $password является опциональным и нужно только для аккаунтов, которые имеют не пустые пароли.

    Системные переменные, которые использует DBD::mysql :

    Значения в системных переменных отменяют значения, переданные раньше. TCP номер порта, отменяет TCP номер порта, переданный в hostname.

    Можно разрешить отладку, установив переменную MYSQL_DEBUG ‘d:t:O,filename’ (где filename является именем файла для записи протокола). Протокол будет записан в файл только если libmysql откомпилирована с поддержкой отладки (опция DBUG).

    Поддерживаются следующие тэги:

    Для получения значения поля AUTO_INCREMENT INSERT, надо:

    Ограничения на работу с ОЧЕНЬ БОЛЬШИМИ числами специфичны для языка perl вообще, а не для какого-либо API в частности. Так что все, что об этом сказано выше, справедливо и в данном случае.

    Вставка двоичных строк

    В случае вставки двоичных данных в базу данных Вы должны обойти некоторые символы. Вы можете использовать следующий метод:

    Msqlperl разработан (C)1997 Alligator Descartes. Модифицирован Msqlperl by Michael ‘Monty’ Widenius. Все изменения доступны на условиях public domain. Pod-документация, на которой основана данная глава, и _InsertID

    Взаимодействие с Oracle на Perl

    Построим web-интерфейс на Perle, если база — Oracle. (Дмитрий Бондарев)

    В последнее время во многих организациях, использующих Oracle в качестве основной СУБД, возникает задача создания web-интерфейса для различных Интернет(Интранет) приложений. Способов организации такого интерфейса существует великое множество. Можно использовать Oracle Web Toolkit, написать его на Jave,Pythone,PHP,Delphi,C….

    Cписок может продолжаться бесконечно. Автор этих строк является сторонником того, что самый быстрый (имеется ввиду, конечно по времени разработки..я не буду спорить по повод быстродействия такого решения, конечно если аналогичное приложение переписать на mod_perle оно будет работать быстрее). Способ создания такого рода приложений возможен на связке Apache+Perl. Как и при работе с большинством СУБД, будем использовать DBI:

    В зависимости от конфигурации вашего сервера последние 3 строки могут и отсутствовать. Но я бы советовал их прописывать для скриптов явным образом, иначе проблем с русскими шрифтами вряд ли удастся избежать…Т.е вы может быть обошлись бы и без них, но в какойто момент на экране могут возникнуть cовсем не те символы, что вы ожидали…

    Синтаксис для соединения с Oracle при использовании DBI ничем не отличается от того, что вы использовали раньше с другими СУБД (например MySQL):

    $source — строка с указанием драйвера БД. В документации по DBD Oracle приводится несколько различных вариантов, у меня эта строка обычно выглядит как dbi:Oracle:hostname;s >

    $user — имя пользователя, соединяющегося с базой ,

    $password — пароль пользователя, соединяющегося с базой ,

    %atribut — необязательная ссылка на хэш атрибутов, задающих каким образом DBI будет реагировать на ошибки.

    Метод connect() возвращает при вызове дескриптор базы данных, если соединение было успешно установлено, либо значение undef в случае неудачи.

    Заметим, что с помощью переменной $DBI::errstr в логах сервера при неудачной попытке мы увидим описание ошибки, в духе:

    Чаще всего взаимодействие приложения и базы данных заключается в извлечении данных. Извлечение данных с использованием DBI — цикл, состоящий из 4 этапов (подготовительный, исполнительный, выборочный, освободительный).

    На первом этапе производится синтаксический разбор SQL команды:

    Если в запросе ошибка или синтаксический разбор неудачен, то метод prepare вернет значение undef . Выяснить, что это происходит можно, если в атрибуте соединения PrintError=>1, тогда в лог DBI напечатает сообщение об ошибке (Недавно в одной из статей я прочитал, что самая большая проблема Perl программиста — трудность отладки кода… Я долго смеялся, так как до использования отладчика обычно не доходят руки:

    99% причин, вызвавших ошибку выясняются при чтении лог файлов сервера, либо включением директивы ( use CGI::Carp qw(fatalsToBrowser); ), которая сообщения на экран броузера выводит…

    Второй этап заключается в сообщении базе данных о необходимости выполнить подготовленную команду SQL.

    Далее Oracle возвращает данные(третий этап) в Perl программу.

    Функционально одинаково можно использовать 2 варианта обработки (по вашему вкусу):

    Цикл while выполняется до тех пор, пока метод fetchrow_array не вернет false. Это возможно в случае когда данных больше нет и когда происходит ошибка.

    На последнем(четвертом) этапе извлечения осуществляется освобождение ресурсов дескриптора команды:

    Но делать такое освобождение явным образом обычно необязательно. Я применяю его только тогда, когда интересна неполная информация, например если нужно узнать метаинформацию из таблицы(см. пример ниже).

    Для SQL команд(INSERT,UPDATE,DELETE), отличных от Select 3 этап пропускается а для 1 и 2 этапов существует альтернативная форма записи:

    в результате переменная $rows будет содержать число удаленых строк для заданного условия либо undef, если произошла ошибка. Однако не стоит забывать, что не всегда альтернативный вариант лучше, так например если стоит делать вставку 3 строк в базу,то вызов подготовки осуществляется 3 раза,исполнение 3 раза, и 3 раза освобождение ресурса…Оптимальнее вручную подготовить один раз дескриптор команды и циклом осуществлять выполнение для дескриптора:

    В этом случае подготовка команды осуществляется однажды, а выполнение трижды для каждой строки. Казалось бы экономия незначительная…А если вы вставляете 1000 строк ?

    Теперь пробуем написать приложение:

    В этом случае подготовка команды осуществляется однажды, а выполнение трижды для каждой строки. Казалось бы экономия незначительная…А если вы вставляете 1000 строк ?

    Теперь пробуем написать приложение:

    Запустите его, перенаправив результат в какой-нибудь файл… в качестве результата. Вы должны будете получить полную информацию о доступных для пользователя $user объектах базы данных $SID.


    Может оказаться, что на выходе СОВСЕМ не будет данных, но это уже не проблема Perla, DBI или Apacha. Не стоит забывать, что соответствующие права доступа для Вашего приложения (или для Вашего пользователя) должны быть выданы администратором Oracle. Это очень важный момент, я например пару раз натыкался, на такие неприятности, вроде бы простой код, а результат: одни ошибки на экране…

    Да,естественно по окончании приложения неплохо было бы явным образом отсоединиться от Oracla:

    Perl и MySQL

    Язык программирования Perl превратился из инструмента, используемого преимущественно администраторами Unix-систем, в наиболее распространенную платформу разработки для World W >Web . Perl не предназначался изначально для Web , но простота его использования и мощные функции для работы с текстом сделали естественным его применение для CGI -программирования. Сходным образом, когда mSQL впервые появилась на сцене, исключительные компактность и скорость выполнения сделали ее очень привлекательной для разработчиков Web , которым требовалось обслуживать ежедневно тысячи операций. MySQL со своей высокой скоростью и расширенными возможностями стала еще более привлекательным средством для веб-разработчиков. Естественно поэтому, что был разработан интерфейс Perl к обеим базам — MySQL и mSQL, — объединив таким образом их достоинства.

    В то время, когда писался этот материал, существовали два интерфейса между Perl и MySQL с mSQL. Более ранний состоит из специализированных интерфейсов Myaql.pm и Msql.pm, которые работают только с MySQL и mSQL соответственно. Другой, более новый интерфейс является подключаемым модулем в комплекте DBI ( DataBase Independent) — независимых от базы данных модулей. DBI является попыткой обеспечить общий Perl API для доступа к любым базам данных и предоставления более высокой переносимости. Интерфейс DBI стал наиболее надежным и стандартным, и разработчики MySQL рекомендуют пользоваться только DBI , поскольку дальнейшая разработка модулей Mysql .pm и Msql.pm прекращена. Именно о DBI мы и расскажем здесь.

    Рекомендуемым методом доступа к базам данных MySQL и mSQL из Perl является интерфейс DBD/ DBI . DBD/ DBI означает DataBase Dependent / DataBase Independent (Зависимый от базы данных /Независимый от базы данных ). Название связано с двухъярусной реализацией интерфейса. В нижнем ярусе находится зависимый от базы данных уровень. На нем существуют свои модули для каждого типа базы данных , доступного из Perl. Поверх этого уровня находится независимый от базы данных уровень. Это тот интерфейс , которым вы пользуетесь при доступе к базе данных. Выгода такой схемы в том, что программисту нужно знать только один API уровня независимости от базы данных . Когда появляется новая база данных , кому-нибудь нужно лишь написать для нее модуль DBD (зависимый), и она станет доступна всем программистам, использующим DBD/ DBI .

    Как и в любом модуле Perl, для получения доступа нужно указать DBI в директиве use :

    При запуске программ Perl для MySQL /mSQL следует всегда задавать аргумент командной строки -w . Благодаря этому DBI будет перенаправлять все специфические для MySQL и mSQL сообщения об ошибках на STDERR , и вы сможете увидеть ошибки, вызванные работой с базой данных, не прибегая к явной проверке их в программе.

    Всякое взаимодействие между Perl, с одной стороны, и MySQL и mSQL — с другой, производится с помощью объекта, известного как описатель базы данных ( handle ). Описатель базы данных ( database handle ) — это объект , представленный в Perl как скалярная ссылка и реализующий все методы, используемые для связи с базой данных. Одновременно можно открыть любое число описателей базы данных , ограничение накладывают только ресурсы системы. Метод connect() использует для создания описателя формат соединения DBI :servertype:database:hostname:port ( имя узла и порта необязательны), дополнительными аргументами служат имя пользователя и пароль :

    Атрибут servertype является именем специфического для базы данных DBD-модуля, в нашем случае » mysql » или «mSQL» (обратите внимание на точное использование регистра). В первом варианте создается соединение с сервером MySQL на локальной машине через сокет Unix. Это наиболее эффективный способ связи с базой данных, который должен использоваться при соединении на локальном сервере. Если указано имя узла , оно используется для соединения с сервером на этом узле через стандартный порт , если только не задан и номер порта . Если при соединении с сервером MySQL вы не указываете имя пользователя и пароль , то пользователь , выполняющий программу, должен обладать достаточными привилегиями в базе данных MySQL . Для баз данных mSQL имя пользователя и пароль не должны указываться.

    В Perl 5 используются два соглашения по вызову модулей. В объектно-ориентированном синтаксисе для ссылки на метод определенного класса используется символ стрелки «->» (как в DBI ->connect ). Другой метод — использование непрямого синтаксиса, в котором за именем метода следует имя класса , а затем — аргументы. В последнем примере метод connect следовало бы записать как connect DBI ‘ DBI :mysql:mydata’, ‘me’, ‘ mypass . В ранних версиях Msql.pm использовался исключительно непрямой синтаксис , и требовалось придерживаться метода использования заглавных букв, обусловленного mSQL С API . Поэтому значительная часть старого кода MsqlPerl содержит строки типа SelectDB $dbh ‘test’ там, где можно было бы написать проще: $dbh->selectdb(‘test’). Если вы еще не догадались, то сообщаем, что мы неравнодушны к объектно-ориентированному синтаксису, хотя бы потому, что использование стрелки делает ясной связь между классом и методом.

    Как только вы соединились с сервером MySQL или mSQL, описатель базы данных — во всех примерах этого раздела $dbh — становится шлюзом к базе данных. Например, так готовится запрос SQL :

    При работе с mSQL для одного описателя базы данных можно одновременно выбрать только одну базу данных, это ограничение накладывается сервером mSQL. Однако в любой момент можно сменить текущую базу данных, повторно вызвав connect . При работе с MySQL можно включать в запрос другие базы данных , явно указывая их имена. Кроме того, и в MySQL , и в mSQL при необходимости одновременного доступа к нескольким базам данных можно создать несколько описателей базы данных и использовать их совместно.

    Для иллюстрации использования DBI рассмотрим следующие простые программы. В примере 1 datashow.cgi принимает в качестве параметра имя узла ; при отсутствии параметра принимается имя » local-host «. Затем программа выводит список всех баз данных, имеющихся на этом узле.

    Пример 1. Программа CGI datashow.cgi показывает все базы данных , имеющиеся на сервере MySQL или mSQL

    В примере 2 tableshow.cgi принимает в качестве параметров имя сервера базы данных (по умолчанию » localhost «) и имя базы данных на этом сервере. Затем программа показывает все таблицы, имеющиеся в этой базе данных.

    Пример 2. Программа CGI tableshow.cgi выводит список всех таблиц в базе данных

    И наконец, пример 3 показывает, как вывести все сведения о некоторой таблице.

    Справочник по Perl

    В этой теме 0 ответов, 1 участник, последнее обновление Васильев Владимир Сергеевич 1 год, 1 месяц назад.

    Введение

    Perl — язык извлечения данных и отчетов созданный Ларри Уоллом. Это скриптовый язык широкого профиля. Может использоваться для написания как системных скриптов (более мощная альтернатива shell-скриптам), так и сgi-скриптов в web-программировании. Кроссплатформенный, распространяется по GNU лицензии.

    Типы данных

    Perl поддерживает следующие типы данных:

    • простой — совмещает в себе числа и строки,
      в терминологии perl также называется скалярным типом;
    • массивы;
    • отображения или ассоциативные массивы;
    • undef — пустое значение;
    • ссылки.

    преобразование типов

    Значение простого типа преобразуется автоматически в число или строку, в зависимости от
    контекста.

    В явном виде логического типа нет. Но он используется в логических операциях и в управляющих
    операторах с условиями как if. Пустая строка, число 0 или строка, содержащая только символ 0,
    значение undef в этих случаях преобразовываются в ложь.

    Переменные

    Имена переменных простого типа должны иметь префикс $,
    массивы префикс @, отображения %.

    В perl существует множество предопределенных переменных. Например, переменная по умолчанию
    $_, которую используют встроенные функции при отсутствии аргументов.

    Если в строке, указанной в двойных кавычках, встречается имя переменной с $ или @
    префиксом, то perl подставляет туда значение этой переменной.

    объявление переменных

    В свободном синтаксисе специально объявлять переменные не надо. Они создаются
    автоматически по мере использования. Область видимости таких переменных файл.

    Жесткий синтаксис задается с помощью директивы strict.
    В этом случае каждая переменная должна быть объявлена одним из следующих способов:

    • my — переменная будет доступна только внутри модуля (файла),
      в котором определена;
    • our — переменная будет доступна из вне, противовес для my начиная с perl 5.6.
      Переменная видна напрямую во всех вложенных пакетах;
    • use vars — отличие от our в том, что область видимости ограничивается пакетом
      в котором переменные объявлены, т.е. не доступна во вложенных пакетах
      (подробнее см. здесь).

    Жесткий синтаксис имеет два преимущества: сложнее описаться, код выполняется
    быстрее.

    Литералы

    Литералы служат для непосредственного представления значений базовых типов.
    Perl поддерживает следующие литералы:

    • вещественные числа — 3.14, -3.14е-10;
    • десятичные целые — 0, -1, 1;
    • шестнадцатиричные целые — 0xad;
    • восьмеричные целые — 023;
    • строки — «строка1», ‘строка2’. Строка в одинарных кавычках ограничена
      в числе возможных ESC-последовательностей и не может подставлять внутри себя
      значения вложенных переменных. Большой текст может указываться как here-doc:
  • undef — значение переменной до присваивания (аналог null-значений в других языках);
  • диапазон чисел — $а .. $b, 1 .. 20, 3.01 .. 3.14 (т.е. 3.01,3.02,…);
  • массив — задается перечислением элементов в круглых скобках, элемент не обязательно константа,
    например: (1, $varname, «строк»);
  • esc-последовательности

    • \a — сигнал;
    • \b — пробел;
    • \c.. — управляющая последовательность, например, \cD — ctrl+D;
    • \e — escape символ;
    • \f — переход на следующую страницу;
    • \n — перевод строки;
    • \r — возврат каретки;
    • \t — табулятор;
    • \0.. — ASCII код символа в восьмеричной системе;
    • \x.. — ASCII код символа в шестнадцатиричной системе;
    • \l — следующий символ в нижний регистр;
    • \L — все символы в нижний регистр до \E;
    • \u — следующий символ в верхний регистр;
    • \U — все символы в верхний регистр до \E;
    • \Q — заключить в обратные косые все небуквенные и нецифровые символы до \Е;
    • \.. — для представления спец. символов, примеры см. ниже;
    • \\ — обратная косая;
    • — двойная кавычка.

    Строки

    Строки задаются текстом в одинарных или в двойных кавычках. Большой текст может быть указан с помощью here-doc (см. выше).

    Строки в одинарных кавычках ограничены в числе возможных esc-последовательностей и не могут подставлять значения вложенных переменных.

    Отдельного типа для строк нет. Простой тип совмещает в себе числа и строки,
    делая преобразование в зависимости от контекста.

    Пустая строка или строка, состоящая из символа 0, в логических выражениях
    рассматривается как ложь.

    операции

    В perl есть отдельные операции отношения над строковыми значениями:

    • eq — равенство;
    • != — неравенство;
    • lt — меньше чем;
    • gt — больше чем;
    • le — меньше либо равно;
    • ge — больше либо равно;

    Операция . соединяет строки в одну.

    регулярные выражения

    Одна из сильных сторон perl это регулярные выражения.

    Для сопоставления строки с шаблоном регулярного выражения используется операция =

    Функция split может разбить строку на массив строк, используя в качестве разделителя
    регулярное выражение. Соединить массив в строку можно функцией join.

    функции

    • chomp($str) — удаляет символ конца строки из указанной строки или массива строк;
    • chop($str) — удаляет последний символ и указанной строки или массива строк;
    • eval($str) — выполняет строку как perl код;
    • index($str,$srch [,$pos]) — поиск первого вхождения $srch или -1,
      если ничего не найдено. Необязательный параметр $pos определяет начальную позицию поиска, по умолчанию
      это первый символ строки;
    • rindex($str,$srch [,$pos]) — поиск последнего вхождения $srch или -1,
      если ничего не найдено. Необязательный параметр $pos определяет начальную позицию поиска, по умолчанию
      это последний символ строки;
    • length($str) — размер строки в байтах;
    • lc($str) — все символы строки в нижний регистр;
    • lcfirst($str) — первый символ строки в нижний регистр;
    • substr($str,$pos [,$len [,$repl]]) — выделяет подстроку с указанной
      позиции и указанной длины (до конца строки по умолчанию).
      Если указан $repl, то происходит замена подстроки на это значение;
    • uc($str) — все символы строки в верхний регистр;
    • ucfirst($str) — первый символ строки в верхний регистр.

    Массивы

    В терминологии perl массивы часто называют списками или списочными
    значениями.

    Литерально массив задается перечислением элементов в круглых скобках.

    Имя переменной массива начинается с символа @.

    При перечислении элементов массива можно использовать переменные,
    диапазоны, другие массивы.

    Для избежания множества кавычек при создании строковых массивов, можно воспользоваться
    функцией qw, которая разбивает текст в скобах на строки, используя пробел или новую строку
    в качестве разделителя.

    операция индексации

    [] — операция индексации, т.е. доступа к элементу массива. Элементы нумеруются
    целыми числами от 0. Для выделения подмассива, в операции индексации можно
    указать сразу несколько индексов, даже используя диапазоны.

    При попытке чтения не существующего элемента возвращается значение undef.
    При попытке записи в не существующий элемент, добавляется новый элемент.

    операция присвоения

    Если массив состоит только из имен переменных, то его можно рассматривать как список
    переменных и использовать в левой части операции присвоении. Если размер списка переменных
    не соответствует размеру присваемого массива, то лишние переменные устанавливаются в значение
    undef, а лишние элементы массива игнорируются.

    функции

    • push(@a,$val) — добавляет в конец массива a элемент со значение val;
    • pop(@a) — удаляет последний элемент массива;
    • shift(@a,$val) — добавляет элемент в начало массива;
    • unshift(@a) — удаляет первый элемент массива;
    • reverse(@a) — меняет порядок элементов на противоположный;
    • sort(@a) — сортирует массив, элементы рассматриваются как строки;
    • chomp(@a) — удаляет из элементов массива символ конца строки, обычно
      используется после клавиатурного ввода.

    ввод/вывод

    При выводе массивы выводятся как сплошная строка.

    При вводе из стандартного потока ввода, элемента разделяются
    новой строкой, т.е. нажатием клавиши enter. А конец ввода массива
    определяется концом файла, т.е. нажатием ctrl+D (в некоторых системах ctrl+Z).
    Правда в windows у меня с этим была проблема.

    Ссылки

    Ссылки perl схожи с указателями С++ в плане функциональности.
    Другими словами,

    • можно получить ссылку (адрес в С++) операцией \ и сохранить
      ее в переменной;
    • разыменовать ссылочную переменную, т.е. получить значение по ссылке;
    • обратиться к элементу массива или отображения по ссылке.

    ссылки и простые значения

    ссылки и массивы

    ссылки и отображения

    ссылки и файловые дескрипторы

    ссылки и процедуры

    Ассоциативные массивы

    В perl отображения реализованы в виде хеш-таблиц.

    Имена переменных отображений имеют префикс %.
    Проинициализировать отображение можно массивом, при этом
    каждая пара элементов будет рассматриваться как пара ключ/значение.
    Также можно разделить ключ и значение не запятой, а =>.

    индексация

    Префикс % используется при обращении к отображению вцелом. При индексации
    следует использовать префикс переменных $. Индексы указываются
    в фигурных скобках.

    При попытке чтения не существующего элемента возвращается значение undef.
    При попытке записи в не существующий элемент, добавляется новый элемент.

    функции

    • keys(%m) — возвращает массив ключей;
    • values(%m) — возвращает массив значений;
    • each(%m) — возвращает массив из двух элементов ключ/значение. Последующие
      вызовы функции для того же отображения, будут возвращать следующий пары.
      Если пар нет, возвращается пустой массив;
    • delete($m<>) — удаяет указанные элементы из отображения.

    Выражения и операции

    Выражения представляют собой множество данных связанных между собой операциями — особыми
    операторами языка, возвращающих некоторое значение. Аргументы операций называют операндами.
    Большинство операций либо унарные (с одним операндом) или бинарные (с двумя операндами).
    Также операции характеризуются приоритетом (старшинством) выполнения в выражении.
    Например, результат выражения 4+5*2
    будет 14, а не 18, так как операция умножения имеет больший приоритет, чем сложение.
    Операции одинакового приоритета выполняются последовательно слева направо.

    алгебраические операции

    • — унарный минус, изменяет знак числа;
    • ++ — инкремент, увеличивает число на 1;
    • — декремент, уменьшает число на 1;
    • * — произведение;
    • / — деление;
    • % — остаток от деления;
    • + — сложение;
    • — вычитание.
    • ** — возведение в степень;

    Существуют два варианта операции инкремента и декремента.
    Префиксный вариант (операнд справа) изменяет операнд сразу,
    постфиксный вариант (операнд слева) изменяет операнд после вычисления всего выражения, в которое
    входит операнд. Применение этих операций к строковым значениям не изменяет класс изменяемого
    символа.

    логические операции

    • ! — отрицание (NOT);
    • && — логическая и (AND);
    • || — логическое или (OR).

    В отличие от С++, && и || возвращают значение выражения, а не истину и ложь,
    что позволяет использовать наподобие условной операции ?.

    операции отношения для чисел

    • — больше;
    • = — больше либо равно;
    • == — равенство;
    • != — не равенство;
    • — сравнение, возвращает -1 — левый операнд меньше правого,
      0 — операнды равны, 1 — левый операнд больше правого.

    операции отношения для строк

    • eq — равенство;
    • != — неравенство;
    • lt — меньше чем;
    • gt — больше чем;
    • le — меньше либо равно;
    • ge — больше либо равно;
    • cmp — сравнение, возвращает -1 — левый операнд меньше правого,
      0 — операнды равны, 1 — левый операнд больше правого.

    побитовые операции

    • & — и;
    • | — или;
    • ^ — исключающее или;
    • > — сдвиг вправо;

    Без знакового сдвига нет.

    операции со строками и шаблонами

    • x — повторение строки n раз. Например, «1, » x 5, то же самое что «1, 1, 1, 1, 1,»;
    • . — объединение строк (конкатенация);
    • =

    — истина, если применение шаблона регулярного выражения,
    указанного в правом операнде, к левому операнду прошло удачно;


    !

    — отрицание предыдущей операции;

    операции назначения

    • = — присваивает левому операнду значение правого операнда;
    • op= — выполняет операцию op над операндами и сохраняет результат в левом операнде.

    прочие операции

    • [] — операция индексации массива;
    • <> — операция индексации для ассоциативного массива;
    • (cond)?ret1:ret2 — условная операция, возвращающая ret1 если cond истина, и ret2 в противном случае;
    • , — запятая, позволяет вычислить последовательно несколько выражений, возвращается последнее выражение. Также
      используется как разделитель;
    • .. — задает диапазон чисел;
    • \ — получение ссылки на переменную;
    • -e — операция определения существования файла, например -e $fname
      (но лучше воспользоваться модуляем FILE);

    Управляющие операторы

    блоковый оператор

    Блоковый оператор <> обязателен при построении утверждений с использованием
    некоторых ниже приведенных операторов.

    условные операторы

    Условный оператор if позволяет выполнить оператор или блок операторов,
    если указанное выражение истинно. A если присутствует
    оператор else выполнить альтернативый оператор или блок операторов.

    Если указанное условие является отрицанием какого-то выражения, то можно
    воспользоваться другим оператором perl — unless.

    Оператор if можно заменить оператором && (логическое И), если
    else и блок операторов не нужны. Аналогично для оператора unless можно воспользоваться
    оператором || (логическое или).

    циклы с предусловием

    Оператор while выполняет блок операторов, пока указанное условие истинно.
    Оператор until выполняет блок операторов, пока указанное условие не истинно.

    циклы с постусловием

    Оператор do <>while выполняет блок операторов, пока указанное условие истинно.
    Оператор do <>until выполняет блок операторов, пока указанное условие не истинно.
    В обоих случаях условие проверяется после выполнения блока, таким образом, тело цикла
    будет выполнено хотя бы один раз.

    цикл по счетчику

    Перед первой итерации выполняется ициализирующее выражение.
    В начале каждой итерации проверяется условие, если оно истинно, то тело цикла выполняется.
    В конце каждой итерации выполняется, завершающее выражение.

    цикл по элементам

    В цикле по элементам foreach можно указать итератор, переменную в которую будет
    сохраняться значение каждого элемента массива. После завершения цикла значение
    переменной итератора возвращается в первоначальное.

    метки

    Метки определяются как label_name:

    операторы last, next, redo

    Оператор last позволяет выйти из текущего блока.

    Оператор next позволяет перейти на следующую итерацию цикла.

    Оператор redo позволяет перезапустить текущую итерацию.

    Данным операторам можно явно указать метку перехода.

    Под текущим блоком понимается тело цикла, кроме циклов с предусловием, или
    независимый блок, т.е. определенный сам по себе.

    Функции

    создание функций

    Функция определяется с помощью ключевого слова sub. Имена функций не
    используют префикс. Таким образом, можно определять переменную $funcname и
    функцию funcname без каких-либо конфликтов.

    аргументы

    Внутри тела функции доступен массив @_, содержащий в качестве элементов
    переданные аргументы. Если типы аргументов не указаны (см. прототипы), то все аргументы
    по умолчанию передаются по ссылке, даже числа.

    вызов функции

    Если функция не была объявлена выше, то вызов функции можно сделать с помощью
    круглых скобок, в которых указывается список аргументов.

    Если функция была объявлена, то после имени функции можно сразу указать
    список аргументов без круглых скобок.

    В последних версиях perl для вызова функций можно использовать префикс &.
    В этом случае список аргументов не обязателен, и если он не указывается то внутри
    функции массив @_ не доступен. Типы переданных аргументов не проверяется. Вызов
    функции подобным образом, никогда не будет инлайновым.

    & обязателен при простом перечислении имен функций.
    & также используется для вызова функций по ссылке (&$subref(), &<$subref>(), $subref->()).

    прототипы

    Под прототипированием в perl понимается указание какого типа могут быть
    аргументы функции. Прототипы указываются в круглых скобках после имени функции.

    • $ — значение простого типа;
    • @ — массив;
    • % — отображение;
    • \$ — ссылка;
    • \@ — ссылка на массив;
    • \% — ссылка на отображение;
    • * — ссылка на элемент из таблицы символов, например файловые дескрипторы;
    • ; — разделитель между обязательными и не обязательными аргументами.

    Ниже приведены примеры объявлений функций с прототипом и их вызовы из
    документации по perl.

    локальные переменные

    С помощью my можно определить одну и более локальных переменных.
    Переменные определенные без my внутри функции в свободном синтаксисе
    являются глобальными.

    возвращаемое значение

    Возвращаемое значение указывается в операторе return.
    Если его нет, то возвращается последнее вычисленное выражение.

    Пакеты. Модули

    шаблон модуля пакета

    Ниже приведен более-менее типичный шаблон модуля пакета. По возможности
    каждая строчка кратко прокомментирована, более подробно некоторые вещи разъясняются в
    следующих пунктах.

    определение модуля

    Имя пакета указывается директивой package. Далее идет содержимое пакета — до конца
    блока или файла. По умолчанию каждый модуль (файл со скриптом) относится к пакету main.

    таблица символов

    С каждым пакетом связана одноименная хеш-таблица символов, содержащая
    ссылки на определенные в пакете имена.

    именованные блоки

    Модуль может иметь именованные блоки специального назначения:

    • BEGIN — данный блок выполняется как только это возможно, не дожидаясь разбора
      остальной части файла. Поэтому блок используется как конструктор в ООП;
    • END — данный блок выполняется как можно позже, т.е. перед самым
      выходом интерпретатора. Поэтому блок используется как деструкторв в ООП.
    • INIT — выполняется непосредственно перед
      запуском программы;
    • CHECK — выполняется после компиляции программы.

    Если определено несколько одноименных блоков, то они выполняются последовательно, по мере
    определения.

    подключение пакетов

    Используемые пакеты указываются одним из следующих способов:

    • use — импортирует все имена из указанных пакетов, так что они доступны
      без . При этом предполагается, что пакет находится в файле с расширением pm,
      так что указывать имя модуля в кавычках с расширением не обязательно.
      В большинстве случаев этот способ предпочтительней, так как наличие
      модуля проверяется сразу.
    • require — делает доступными указанные пакеты. Для доступа к именам, определенным
      в этих пакетах используется . Когда имя модуля указывается в кавычках, все :: в имени
      пакета отображаются в разделитель директорий /.

    различия our и use vars

    Переменные объявленные с помощью директивы use vars видны только
    в том пакете модуля, в котором объявлены.

    Переменные объявленные с помощью our видны во вложенных пакетах. Сравните
    следующий пример с предыдущим.

    инсталяция модуля

    Новый модуль нужно скопировать в директорию библиотек perl. Например, в ActivePerl для
    Windows это поддиректории lib и site/lib в месте инсталляции. Если есть менеджер пакетов
    как в ActivePerl, то можно воспользоваться им (запуск в командной строке ppm).

    Переменные окружения

    Переменные окружения хранятся в отображении %ENV,
    ниже приведены основные ключи и их значения:

    • CONTENT_TYPE — тип данных, используется когда клиент отсылает присоединенное
      содержимое на сервер (например, загрузка файла);
    • CONTENT_LENGTH — размер переданных данных методом post, считать эти данные можно из
      стандартного потока ввода;
    • HTTP_COOKIE — множество кукисов в форме ключ/значение
    • HTTP_USER_AGENT — значение поля User-Agent (например, какой-нибудь веб-браузер);
    • PATH_INFO — путь для cgi скрипта;
    • QUERY_STRING — информация, посылаемая методом get;
    • REMOTE_ADDR — ip адрес удаленного хоста, запросившего скрипт;
    • REMOTE_HOST — имя удаленного хоста запросившего скрипт;
    • REQUEST_METHOD — метод, по которому был запрошен скрипт (GET или POST);
    • SCRIPT_FILENAME — имя файла скрипта с полным путем;
    • SCRIPT_NAME — имя cgi скрипта;
    • SERVER_NAME — хост или ip адрес сервера;
    • SERVER_SOFTWARE — имя и версия сервера.

    Полный набор переменных можно посмотреть следующим скриптом:

    Если скрипт будет запущен локально наподобие shell скрипта,
    то cgi переменных вы не обнаружите.

    Пример DBI для MySQL

    — perl модуль реализующий абстрактный интерфейс для доступа к базам данным.
    Реальное взаимодействие с базой данных осуществляется через другие специальные perl модули
    — драйвера баз данных.

    Если используется ActivePerl установить DBI и драйвер для MySQL (DBD-mysql пакет) можно через
    менеджер пакетов, который запускается в командной строке ppm.
    Драйвер можно скачать отдельно и установить в ручную.

    Управление структурой базы данных без боли

    Хочу поделиться инструментом, который родился при разработке одного веб-проекта и очень помогает мне не потеряться в море таблиц, хранимых процедур, индексов и прочих обитателей базы данных.

    Сам проект написан на Django, в качестве бекенда — PostgreSQL. В самом начале работы было решено, по крайней мере, частично отказаться от использования Django ORM в пользу «сырого» SQL и хранимых процедур. Другими словами, почти вся бизнес-логика вынесена на уровень базы данных. Сразу скажу, что готовить ORM я умею, но в данном случае требовалось производить многоступенчатые вычисления, связанные с множеством выборок, а это лучше делать на сервере БД и не таскать промежуточные данные в приложение.

    Столкнувшись с необходимостью поддержания структуры базы данных вручную, без приятностей Django Migrations, я выяснил, что вручную писать инкрементальные SQL патчи возможно, но трудно уследить за зависимостями объектов БД. К примеру, когда функции, которая используется где-то еще, добавляешь еще один аргумент, простого CREATE OR REPLACE недостаточно — ее нужно сначала DROP, а потом CREATE. При этом нужно предварительно удалить зависимые от нее функции, а потом создать заново (а если от этих функций еще кто-то зависит, тогда надо и их пересоздать).

    Под катом краткое описание возможностей в виде туториала. Встречайте — Sqlibrist.

    Надо сказать, что мою проблему уже научились решать. Например, сравнительно давно существует Sqitch. Он позволяет описывать структуру базы данных в декларативном виде на SQL. Каждая таблица, вид или функция хранится в отдельном файле, а простой DSL описывает зависимости. Утилита написана на Perl, и мне, не знакомому с разработкой на Perl и экосистемой его пакетов, пришлось очень постараться, чтобы эту утилиту скомпилировать. Возможно, в силу долгой истории разработки, Sqitch имеет многовато зависимостей, как для такой простой программы. Еще мне не понравилось запутанное описание зависимостей и работа с версиями структуры. Признаю, что я просто не захотел подстраиваться и разбираться с инструментом, который мне показался неудобным.

    Создавая Sqlibrist, я вдохновлялся и Sqitch, и Django Migrations, и немного VCS. А еще хотел, чтобы он был простым и понятным в использовании. Объекты структуры БД хранятся в отдельных файлах. Каждый содержит SQL-инструкцию для создания и (не обязательно) удаления этого объекта. Зависимости между объектами описываются явно в виде директив на встроенном DSL (в нем, кстати, только три ключевых слова: REQ, UP, DOWN). Подобно системе управления версиями, Sqlibrist хранит снимки структуры БД и SQL-патч для обновления до него с предыдущего снимка.

    Интеллект Sqlibrist ограничен, он не парсит SQL и не генерирует ALTER TABLE — это ваша работа. Он только отслеживает изменения в файлах и создает патчи с вашими инструкциями, а также ведет учет примененных миграций.
    Все это звучит как-то абстрактно, давайте перейдем к практике.

    Установка

    Моя основная ОС — Linux и на сервере и на десктопе, поэтому инструкции по установке только для нее. Возможно, кто-нибудь поможет мне с Windows и Mac.

    Сначала заголовочные файлы:

    Ubuntu

    Fedora/CentOS

    Sqlibrist написан на Python и имеет две зависимости: PyYAML и что-то одно из psycopg2 и mysql-python.

    Устанавливается с помощью pip либо в virtualenv, либо в системные библиотеки:

    После установки становится доступной команда sqlibrist.

    База данных интернет-магазина

    Давайте поиграемся с Sqlibrist на примере примитивного интернет-магазина.

    Команда init создала структуру директорий нашего проекта:

    В sqlibrist.yaml конфигурация проекта для подключения к БД:

    Чтобы проверить, что настройки верны:

    Дальше проинициализируем таблицу, где Sqlibrist будет хранить информацию о примененных миграциях. Эта часть идентична Django Migrations/South.

    Кстати, в терминологии Sqlibrist, миграция — это снимок структуры базы и патчи для применения этой миграции или отката к предыдущей.

    Далее создадим файл shop_schema/schema/tables/user.sql:

    Первая строка —UP означает, что следующие SQL-инструкции создают объект БД. Этого достаточно для создания таблицы.

    Аналогично создадим еще два файла:

    Обратите внимание на строку —REQ tables/user. Она означает, что текущий объект зависит от объекта в файле tables/user.sql (в REQ расширение не пишется). Это гарантирует, что при генерации патча таблица user будет создана перед таблицей order. Все —REQ должны идти в начале файла.

    Создадим первую миграцию:

    Файлы миграции созданы в shop_schema/migrations/0001-initial:

    В up.sql содержится патч для применения миграции, down.sql в данном случае пустой, а в schema.json снимок текущей структуры БД.

    Перед применением патча вы можете (и это желательно) ознакомиться с текстом патча и удостовериться, что он делает то, что нужно. Если он вас не устраивает, удалите всю директорию 0001-initial и создайте миграцию заново. Можете редактировать up.sql и down.sql, если знаете, что делаете, но не трогайте schema.json.

    Теперь применим нашу первую миграцию:

    Три таблицы созданы. Теперь нам нужен вид, который выводит заказы пользователя с суммами заказа:

    После директивы —DOWN идут инструкции для удаления user_orders при его пересоздании.

    Общее правило: содержащие данные объекты, например таблицы, мы обновляем вручную, поэтому их описания не содержат —DOWN, а функции, типы, индексы можно безболезненно удалять и создавать, поэтому это можно доверить автоматике.

    Еще нам нужна функция, которая возвращает user_orders для заданного пользователя:

    Создадим и применим следующую миграцию:

    Таким образом, у нас 4 таблицы, один вид и одна функция.

    Допустим, нам нужно добавить еще одно поле в вид user_orders. Вот какие проблемы могут возникнуть:

    • мы можем удалить и создать заново новый вид user_orders, но БД не позволит этого сделать, потому что функция get_user_orders зависит от этого вида;
    • можно схитрить и выкрутиться CREATE OR REPLACE VIEW user_orders. но тип поля вида и тип результата функции будут отличаться. И в этом случае БД не даст нам этого сделать без пересоздания функции.

    Sqlibrist как раз и предназначен разрешать такие проблемы. Добавим поле SUM(op.quantity) as order_total в вид user_orders:

    Можно посмотреть, что же изменилось:

    Вы видите, что сначала удаляется зависящий объект — функция get_user_orders, потом сам вид. Далее вид создается с новой структурой, после восстанавливается функция. Такая схема будет работать для зависимостей произвольной глубины (но не циклической зависимости — Sqlibrist попросит исправить ее).

    Применим эту миграцию:

    Наконец, давайте внесем изменение в таблицу. Поскольку файлы с определениями таблиц не содержат —DROP, будем работать руками:

    1. Изменим инструкцию CREATE TABLE;
    2. Сгенерируем новую миграцию той же командой makemigration;
    3. Добавим в up.sql необходимый ALTER TABLE.

    Добавим новое поле «type» text в таблицу product:

    Это пункт 1. Теперь создадим миграцию:

    Обратите внимание, что несмотря на то, что мы изменили определение таблицы product, tables/product не присутствует в журнале миграции, НО все зависимые от него объекты пересоздаются. Это пункт 2.

    Теперь пункт 3: откройте в редакторе shop_schema/migrations/0004-new product field/up.sql и найдите строку 12 с текстом — ==== Add your instruction here ====. Это логическая середина миграции. В этот момент все зависимые объекты удалены и мы можем вставить наш ALTER TABLE.

    Наш up.sql будет выглядеть так:

    Можно применить этот патч:

    На этом моменте оставим в покое наш интернет-магазин.

    Еще Sqlibrist умеет интегрироваться в проект Django, я им пользуюсь именно в этом контексте.

    Сайт проекта — здесь, баг-репорты приветствуются.

    Справочник по Perl

    Для использования интерфейсов mSQL и MySQL к модулям DataBase Dependent/DataBase Independent (DBI/DBD) или MsqlPerl и MysqlPerl необходимо иметь следующие компоненты:

    В вашей системе должны быть установлены работающие экземпляры Perl 5. Ко времени написания этой книги последний релиз Perl имел номер 5.005_02. Следует пользоваться по меньшей мере Perl 5.004, поскольку в более ранних версиях были ошибки, связанные с защитой. Более подробные сведения о Perl, включая адреса для загрузки, можно найти по адресу: http://www.perl.com.

    Независимую от базы данных часть модуля DBI/DBD можно загрузить из Comprehensive Perl Archive Network (CPAN). На момент написания книги последней версией был DBI-0.90. Он находится на http://www.perl.com/CPAN/authors/id/TIMB/DBI/DBI-l.06.tar.gz.

    Модуль Data::ShowTable упрощает отображение больших объемов данных. Это требуется для модулей Msql-Mysql. Последняя версия — Data-ShowTable-З.З, ее можно найти по адресу: http://www.perl.com/CPAN/authors/id/AKSTE/Data-ShowTable-3.3.tar.gz.

    В главе 3 «Установка» подробно рассказано о том, как получить и установить серверы баз данных mSQL и MySQL.

    Компилятор С и сопутствующие средства

    Для модулей MsqlPerl и MysqlPerl необходим ANSI-совместимый компилятор С, а также обычные сопутствующие средства, такие как make, Id и т. д. Вам должно хватить тех средств, с помощью которых вы собрали Perl. Если у вас нет этих инструментов, компилятор GNU С и все необходимые поддерживающие программы можно бесплатно получить на ftp://ftp.gnu.org/pub/gnu/.

    В настоящее время модули Msql-Mysql поддерживает Йохен Видман (Jochen Wiedmann), чье ID в CPAN выглядит как JWIED. Поэтому текущие модули Msql-Mysql всегда можно найти на http://www.perl.com/ authors/id/ JWIED. На момент написания книги текущей версией была Msql-Mysql-modules-1.2020.tar.gz.

    После загрузки пакета разархивируйте его:

    tar xvzf Msql-Mysql-modules-1.2020.tar.gz

    В каталоге дистрибутива есть файл INSTALL, содержащий несколько советов по установке. Сначала нужно выполнить файл Makefile.PL:

    Эта команда сначала спрашивает, желаете ли вы установить модули для mSQL, MySQL или те и другие. Можно установить модули для любого установленного вами сервера баз данных.

    После проверки системы программа запрашивает местоположение установки mSQL. Это каталог, содержащий подкаталоги lib и include, в которых расположены библиотеки и включаемые файлы mSQL. По умолчанию этим каталогом является /usr/local /Hughes, но обязательно проверьте это, поскольку во многих системах используется /usr/local или даже /usr/local/Minerva.

    Затем сценарий установки запрашивает путь к MySQL. Как и в случае mSQL, это каталог, содержащий надлежащие подкаталоги lib и include, по умолчанию — /usr/local. Это расположение верно для большинства установок, но следует обязательно проверить, не используются ли другие каталоги.

    После установки сценарий создает соответствующие make-файлы и завершается. Затем нужно запустить make и скомпилировать файлы.

    Если вы правильно установили Perl, mSQL и/или MySQL, то команда make должна пройти без ошибок. После завершения ее работы будут созданы все модули, и единственное, что останется — это протестировать и установить их.

    Во время выполнения по экрану пробегает ряд отладочных имен, за каждым из которых должно следовать . . . ok. И наконец, нужно установить модули.

    У вас должно быть разрешение записи в каталог установки Perl. Кроме того, необходимо иметь разрешение на запись в системный каталог для программ (обычно /usr/local/bin или /usr/bin), чтобы установить поставляемые с модулем вспомогательные программы pmsql, pmysql и dbimon.

    DBI API является стандартным API баз данных в Perl. Поэтому, хотя MsqPerl и MysqlPerl могут быть более распространены в унаследованных программах, новые программы следует писать с использованием DBI.

    Следует объявлять во всех программах Perl, использующих модуль DBI.

    DBI: :available_drivers возвращает список имеющихся драйверов DBD. Функция выполняет это, осуществляя поиск модулей DBD в дистрибуции Perl. Если в аргументе не передано значение true, то при обнаружении двух одноименных модулей DBD выводится предупреждение. В текущем дистрибутиве Msql-Mysql драйвер для mSQL называется ‘mSQL’, а драйвер для MySQL — ‘mysqP.

    my @drivers = DBI->available_drivers;

    print «Доступны следующие драйверы:\n» . join(«\n»,@drivers) . «\n Ho нас интересуют только mSQL и mysql. :)\n»;

    $result = $statement_handle->bind_col($col_num, \$col_variable, \%unused);

    DBI: :bind_col связывает колонку команды SELECT с переменной Perl. При всяком чтении или изменении колонки изменяется значение соответствующей переменной. Первым аргументом является номер колонки в команде, при этом колонки нумеруются с 1. Второй аргумент — ссылка на переменную Perl, которая должна быть привязана к колонке. Необязательный третий аргумент ссылается на хэш атрибутов. В DBD: :mysql и DBD: :mSQL он не используется. При невозможности в силу каких-то причин сделать привязку функция возвращает неопределенное значение undef.

    my $db = DBI->connect(‘DBI:mSQL:mydata’, undef,undef);

    my $query = «SELECT name, date FROM myothertable»;

    my $myothertable_output = $db->prepare($query);

    $myothertable_output»bind_col(2, \$date, undef);

    # Теперь $name и Sdate привязаны к соответствующим полям выходных данных.

    # Каждый раз $name и $date автоматически изменяются.

    print «Имя: $name Дата: $date\n»; >

    $result = $statement_handle->bincl_columns(\%unused, @list_of_refs_to_vars);

    DBI: : bind_columns привязывает весь список скалярных ссылок к значениям соответствующих полей в выдаче. Первый аргумент функции -ссылка на хэш атрибутов, как в DBI: :bind_col . DBD::mSQL и DBD::mysql не используют этот аргумент. Последующие аргументы должны быть ссылками на скаляры. Скаляры можно с таким же успехом группировать в структуру \($var1, $var2) . Ссылок на скаляры должно быть ровно столько, сколько полей в выходных результатах, иначе выполнение программы будет прекращено.

    my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

    my $query = «SELECT name, date FROM myothertable»;

    my $myothertable_oulput = $db->prepare($query);

    $mynfhertable_outpul->bind_columns(undef, \($name, $daLe));

    # $name и $date теперь привязаны к соответствующим полям в выдаче,

    # $name и $date каждый раз автоматически изменяются.

    print «Имя: $name Дата: $date\n»;

    $result = $statement_handle->bind_param($param_number, $bind_value);

    $result = $statement_handle->bind_param($param_number, $bind_value, $bind_type);

    $result = $statenent_handle->bind_param($param_number, $bind_value, \%bind_type);

    DBI: : bind_param подставляет в команды действительные значения вместо меток-заполнителей ‘?’ (см. OBI:: prepare). Первый аргумент — номер метки-заполнителя в команде, нумерация начинается с 1 (слева направо). Второй аргумент — подставляемое значение. Необязательный третий аргумент задает тип подставляемого значения. Это может быть скаляр или ссылка на хэш вида < TYPE =>&DBI:: SQL_TYPE > , где ‘SQL_TYPE’ — тип параметра. На момент написания этой книги DBI поддерживал SQL-типы (недокументированные) SQL_CHAR, SQL_NUMERIC, SQL_DECIMAL, SQL_INTEGER, SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE и SQL_VARCHAR. Соответствие их фактическим типам, используемым DBD::mSQL и DBD::Mysql, не документировано. Тем не менее в таблице 21-1 приведен список соответствия на данный момент. Если подстановка невозможна, функция возвращает undef.

    Таблица 21-1. Соответствие типов SQL

    my $db = DBI->connect(‘DBD:msql:mydata’,’me’,’mypass’);

    my Sstatement = $db->prepare(

    «SELECT name, date FROM myothertable WHERE name like ? OR name like ?»);

    # Теперь команда будет такой:

    # SELECT name, date FROM myothertable WHERE name like ‘J%’ or name like

    $db = DBI->connect($data_source, $username, $password);


    $db = DBI->connect($data_source, $username, $password, \%attributes);

    DBI:: connect требует по крайней мере три аргумента и необязательный четвертый. Через возвращаемый описатель выполняются все операции с сервером базы данных. Первый аргумент является источником данных. Список имеющихся источников можно получить с помощью DBI: :data_sources . Для mSQL и MySQL формат источника данных ‘DBI:mSQL:$database:Shostname:Sport’ и ‘DBI:mysql:Sdatabase:Shostname:Sport’ соответственно. Можно опустить :Sport при соединении через стандартный порт. Аналогично можно опустить ‘: Shostname: Sport’ при соединении с сервером на локальном узле с помощью сонета Unix. Имя базы данных указывать обязательно.

    Второй и третий аргументы — имя пользователя и пароль для подключения к базе данных. Для mSQL оба аргумента должны иметь значение ‘undef’. Если они заданы как ‘jndef при работе с MySQL, то у пользователя, запустившего программу, должны быть права доступа к требуемым базам данных.

    Последний аргумент необязателен и является ссылкой на ассоциативный массив. Данный хэш позволяет определить некоторые атрибуты соединения. В настоящее время поддерживаются только атрибуты PrintError, RaiseError и AutoCommit. Для сброса им нужно придать значение 0, для установки — какое-либо истинное значение. По умол-чаник) PrintError и AutoCommit включены, a RaiseError — сброшен. Поскольку в данное время ни mSQL, ни MySQL не поддерживают транзакции, атрибут AutoCommit должен быть установлен (более подробно см. Атрибуты).

    При неудаче соединения возвращается неопределенное значение undef, и в $DBI;:errstr помещается ошибка.

    my $db1 = DBI->connect(‘DBI: mSQL:mydata’,undef,undef);

    # Теперь $db1 представляет соединение с базой данных ‘mydata’на локальном

    my $db2 = DBI->connect( ‘DBI:mysql:mydata:myser-ver.com’,’me’,’mypassword’);

    # Теперь $db2 представляет соединение с базой данных ‘mydata’ сервера MySQL

    # ‘myserver.com’ через порт по умолчанию.

    # При соединении использовались имя пользователя ‘те’ и пароль ‘mypassword’.

    my $db3 = DBI->connect(‘DBI:mSQL:mydata’,undef,undef, <

    # Теперь $db3 — такое же соединение, как $db1, за исключением того, что

    # установлен атрибут ‘RaiseError’.

    DBI: :data_sources принимает в качестве аргумента имя модуля DBD и возвращает все имеющиеся для этого драйверы базы данных в форма- » те, пригодном к использованию в качестве источника данных функцией DBI::connect . Программа заканчивает свое выполнение с ошибкой, если задано неверное имя драйвера DBD. В текущих версиях модулей Msql-Mysql драйвер для mSQL называется ‘mSQL’, а для MySQL -‘mysql’.

    my §msql_data_sources = DBI->data_sources(‘mSQL’);

    my @mysql_data_sources = DBI->data_sources(‘mysql’);

    # Должны быть установлены DBD::mSQL и DBO::mysql, иначе

    # выполнение программы прекратится.

    print «mSQL databases:\n» . join(«\n»,@msql_data_sources) , «\n\n»;

    print «MySQL databases:\n» . join(«\n»,@mysql_data_sources) . «\n\n»;

    $rows_affected = $db->do($statement, \%unused);

    $rows_affected = $db->do($statement, \%unused, @bind_values);

    DBI: : do непосредственно выполняет SQL-команду, не являющуюся командой SELECT, и возвращает число измененных строк. Этот способ быстрее, чем пара DBI: :prepare/DBI: :execute , требующая два вызова функции. Первый аргумент — сама команда SQL. Второй аргумент не используется в DBD::mSQL и DBD::mysql, но для других модулей DBD может содержать ссылку на хэш атрибутов. Последний аргумент -массив значений для подстановки в команду вместо меток-заместителей ‘?’. Подстановка происходит слева направо. Дополнительно DBI: : do автоматически заключит подставляемые строковые значения в кавычки.

    my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

    my $rows_affected = $db->do(«UPDATE mytable SET name=’Joe’ WHERE name=’Bob»‘);

    print «$rows_affected Joe заменены на Bob’s\n»;

    my $rows_affected2 = $db->do(«INSERT INTO mytable (name) VALUES (?)», <>, («Sheldon’s Cycle»));

    # После заключения в кавычки и подстановки

    # серверу базы данных посылается команда

    #INSERT INTO mytable (name) VALUES (‘Sheldon’s Cycle’)

    DBI: : disconnect отсоединяет описатель базы данных от сервера баз данных. Для mSQL и MySQL в этом обычно нет необходимости, поскольку эти базы данных не поддерживают транзакций, и неожиданное отсоединение не причинит вреда. Однако от баз данных, поддерживающих транзакции, нужно отсоединяться явным образом. Поэтому, чтобы получить переносимую программу, нужно всегда отсоединяться от базы данных перед выходом. При ошибке во время отсоединения возвращается ненулевое значение, и в $DBI: :errstr устанавливается ошибка.

    my $db1 = DBI->connect( ‘DBI:mSQL:mydata’,undef,undef);

    my $db2 = OBI->connect(‘DBI:mSQL:mydata2’,undef,undef);

    # Соединение ‘mydata’ разорвано. Соединение с ‘mydata2’

    $neat_rows = DBI::dump_results($statement_handle, Smaxlen);

    $neat_rows = DBI::dump_results($statement_handle, $maxlen, $line_sep);

    $neat_rows = DBI::dump_results($statement_handle, $maxlen, $line_sep,$field_sep);

    $neat_rows = DBI::dump_results($statement_handle, $maxlen, $line_sep,$field_sep, $file_handle);

    DBI: :dump_results выводит содержание описателя команды в удобном и упорядоченном виде, применяя к каждой строке DBI: :neat_string . Функцию удобно использовать для быстрой проверки результатов запроса во время разработки программы. Единственный обязательный аргумент — описатель команды. Второй аргумент, если имеется, задает максимальный размер полей в таблице, по умолчанию равный 35. Третий аргумент задает строку, используемую для разграничения строк данных, по умолчанию- \n. Четвертый аргумент задает строку, используемую для разделения значений полей в строке, по умолчанию используется запятая. Последний аргумент задает ссылку на глобальный описатель файла, в который выводятся результаты. По умолчанию это STDOUT. Если невозможно прочесть описатель команды, возвращается значение undef.

    my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

    my Squery = «SELECT name, date FROM myothertable»;

    my $myothertable_output = $db->prepare($query);

    # Вывести результаты в аккуратной таблице.

    print DBI: :dump_results($iriyothertable_output,

    # Снова вывести результаты в файл ‘myothertable,’.

    $DBI::err возвращает код последней по времени ошибки DBI. Код ошибки соответствует сообщению об ошибке, возвращаемому функцией $DBI: :errstr. Переменная $DBI: :err выполняет ту же задачу. Эта функция применима с описателями как баз данных, так и команд.

    my $db = DBI->connect(‘DBI:mysql:mydata’,

    # Этот запрос имеет синтаксическую ошибку.

    my Soutput = $db->prepare(‘SLECT * from mydata’);

    print «Error $DBI:err: $DBI:errstr\n»; >

    Эта функция возвращает сообщение о последней происшедшей ошибке DBI. Значение сохраняется до возникновения новой ошибки, когда оно будет заменено. Если во время данного сеанса ошибок не было, функция возвращает undef. Переменная $DBI: :errstr выполняет ту же задачу. Эта функция применима с описателями как баз данных, так и команд.

    my $db = DBI->connect(‘DBI:mysql:mydata’,

    my $error = $db->errstr;

    warn(«Boj последняя ошибка DBI: $error»);

    DBI: : execute выполняет SQL-команду, содержащуюся в описателе команды. Для запроса, не являющегося SELECT, функция возвращает число измененных строк. Функция возвращает -1, если число строк неизвестно. Для запроса типа SELECT при успехе возвращается истинное значение. Если заданы аргументы, они используются для подстановки имеющихся в команде меток-заместителей (см. DBI: : prepare ).

    my $db = DBI->connect(‘OBI:mSQL:mydata’,undef,undef);

    my $statement_handle = $db->prepare(«SELECT * FROM mytable»);

    my $statement_handle2 = $db->prepare(«SELECT name, date FROM myothertable WHERE name like ?»);

    # Выполнена первая команда.К значениям можно

    # обращаться через описатель.

    # Выполнена вторая команда следующего содержания:

    # SELECT name, date FROM myothertable WHERE name like ‘J%’

    DBI: :fetchall_arrayref возвращает все оставшиеся данные в описателе команды в виде ссылки на массив. Каждая строка массива — ссылка на другой массив, в котором содержатся данные этой строки. Если в описателе команды нет данных, функция возвращает неопределенное значение undef. Если с этим описателем команды уже выполнялись функции DBI: :fetchrow_ *, то DBI: :fetchall_arrayref возвращает все данные, оставшиеся после последнего обращения к DBI: : fetch row *.

    my $db = DBI->connect(‘DBI:mSQL:mydata’ ,undef,undef);

    my $query = «SELECT name, date FROM myothertable»;

    my Soutput = $db->prepare($query);

    my $data = $output->fetchall_arrayref;

    # Теперь $data является ссылкой на массив массивов. Каждый элемент

    # ‘главного’ массива сам является ссылкой на массив, содержащий строку данных.

    print «Четвертой строкой данных в таблице является: » . $data->[3][1]. «\n»;

    # Элемент 3 ‘главного’ массива является массивом, содержащим четвертую

    # строку данных, # Элемент 1 этого массива является датой.

    DBI: : fetch row возвращает очередную строку данных из описателя команды, созданного DBI: :execute . Каждое последующее обращение к DBI: : fetchrow возвращает очередную строку данных. Когда данных больше нет, функция возвращает неопределенное значение undef. Порядок элементов в результирующем массиве определяется исходным запросом. Если запрос имел вид SELECT * FROM . . . , то элементы следуют в том порядке, в котором они были определены в таблице.

    my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

    my $query = «SELECT name, date FROM myothertable WHERE name LIKE ‘Bob%'»;

    my $myothertable_output = $db->prepare($query);

    # Это первая строка из $myothertable_output.

    ($name, $date) = $myothertable_output->fetchrow_array;

    # Это следующая строка.

    ($name, $date) = $myothertable_output->fetchrow_array;

    my @name_and_date = $myothertable_output->fetchrow_array;

    DBI: : fetchrow_arrayref и ее псевдоним DBI: :fetch работают точно так же, как DBI: :fetchrow_array , но возвращают не фактический массив, а ссылку на него.

    my $db = DBI->connect(‘DBI:mSQL:mydata’, undef, undef);

    my $query = «SELECT name, date FROM myothertable WHERE name LIKE — Bob%'»;

    my $myothertable_output = $db->prepare($query);

    my $name1 = $myothertable_output->fetch->[0]

    # Это поле ‘name’ из первой строки данных,

    my $date2 = $myothertable_output->fetch->[1]

    # Это поле ‘date’ из второй строки данных.

    # Это целиком третья строка данных.

    # возвращает ссылку на массив. Можно ‘преобразовать’ ее в действительный

    # массив, используя конструкцию @<>.

    DBI: :fetchrow_hashref работает так же, как OBI: :fetchrow_arrayref , но возвращает ссылку на ассоциативный, а не на обычный массив. Ключами хэша являются имена полей, а значениями — значения в этой строке данных.

    my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

    my $query = «SELECT * FROM mytable»;

    my $mytable_output = $db->prepare($query);

    my %row1 = $mytable_ouput->fetchrow_hashref;

    my @field_names = keys %row1;

    # @field_names содержит теперь имена всех полей в запросе.

    # Это делается только один раз. Во всех следующих строках будут те же поля,

    my @row1 = values %row1;

    DBI:: finish освобождает все данные в описателе команды, чтобы можно было уничтожить описатель или снова подготовить его. Некоторым серверам баз данных это необходимо для освобождения соответствующих ресурсов. DBD::mSQL и DBD::mysql не нуждаются в этой функции, но для переносимости кода следует использовать ее по окончании работы с описателем команды. Функция возвращает неопределенное значение undef, если описатель не удается освободить.

    my $db = DBI->connect(‘DBI:mysql:mydata’,’me’,’mypassword’);

    my $query = «SELECT * FROM mytable»;

    my $mytable_output = $db->prepare($query);

    # Теперь можно переназначить $mytable_output или подготовить для него

    @dbs = $db->func(«$hostname», ‘_ListDBs’);

    @dbs = $db->func(«$hostname:Sport», ‘_ListDBs’);

    $result = $drh->func( $database, ‘_CreateDB’ );

    Sresult = $drh->func( Sdatabase, ‘_DropDB’ );

    DBI::func вызывает специализированные непереносимые функции, включенные в различные драйверы DBD. Она используется с описателем базы данных или описателем команды, в зависимости от назначения специализированной функции. По возможности следует использовать равносильную переносимую функцию. При использовании специализированной функции сначала передаются ее аргументы как скаляр, а затем — имя функции. DBD::mSQL и DBD::mysql реализуют следующие функции:

    Функция _ListDBs принимает имя узла и необязательный номер порта и возвращает список имеющихся у сервера баз данных. Лучше использовать переносимую функцию DBJ::data_sources .

    Функция _ListTables возвращает список таблиц, имеющихся в текущей базе данных.

    Функция _CreateDB принимает в качестве аргумента имя базы данных и пытается создать эту базу данных на сервере. Для работы с этой функцией необходимо иметь право создания баз данных. Функция возвращает -1 в случае неудачи и 0 в случае успеха.

    Функция _DropDB принимает в качестве аргумента имя базы данных и пытается удалить с сервера эту базу данных. Данная функция не выводит пользователю сообщений и при успешном выполнении удаляет базу данных навсегда. Для работы с этой функцией необходимо иметь право удаления баз данных. Функция возвращает -1 в случае неудачи и 0 в случае успеха.

    my $db = DBI->connect(‘DBI:mysql:mydata’,’me’,’mypassword’);

    my @tables =.$db->func(‘„List-Tables’);

    # @tables содержит теперь список таблиц в ‘mydata’.

    $neat_string = DBI: :neat($s’tring);

    $neat_string = DBI::neat($string, $maxlen);

    DBI: : neat Принимает в качестве аргументов строку и необязательную длину. Затем строка форматируется для аккуратного вывода. Вся строка заключается в одиночные кавычки. Непечатаемые символы заменяются точками. Если задан аргумент длины, все символы после максимальной длины удаляются, а строка заканчивается тремя точками (. ). Если длина не указана, по умолчанию используется значение 400.

    my $string = «Это очень, очень длинная строка, в которой много чего написано. «;

    my$neat_string = OBI: :neat($string,14);

    # Теперь $neat_string такая: ‘Это очень, оче.

    $neat_string = DBI::neat_list(\@listref, $maxlen);

    $neat_string = DBI::neat_list(\@listref, $maxlen, $field_seperator);

    DBI: :neat_list принимает три аргумента и возвращает аккуратно отформатированную строку, пригодную для вывода. Первый аргумент содержит ссылку на список выводимых значений. Второй аргумент -максимальная длина каждого поля. Последний аргумент — строка, используемая для разделения полей. Для каждого элемента списка вызывается OBI: :neat с использованием заданной максимальной длины. В результирующих строках для разделения полей используется последний аргумент. Если последний аргумент не задан, в качестве разделителя применяется запятая.

    my @list = (‘ Bob’, ‘Joe’, ‘Frank’);

    my $neat_string = DBI::neat_list(\@list, 3);

    # Теперь $neat_string такая: ‘Bob’, ‘Joe’, ‘Fra.

    $statement_handle = $db->prepare($statement, \%unused);

    DBI: :prepare принимает в качестве аргумента SQL-команду, которую некоторые модули баз данных переводят во внутреннюю компилированную форму, исполняемую быстрее при вызове DBI: : execute . Эти модули DBD (не DBD::mSQL или DBD::mysql) принимают также ссылку на хэш необязательных атрибутов. Серверы mSQL и MySQL в настоящее время не реализуют концепцию подготовки команд, поэтому DBI: : prepare просто запоминает команду. По желанию вместо значений данных в команду можно вставить любое количество символов ‘?’. Эти символы известны как метки-заместители (placeholders). Функция DBI: : bind_param осуществляет подстановку действительных значений вместо меток-заместителей. Если по какой-либо причине команду нельзя подготовить, функция возвращает undef.

    my $db = DBI->connect(‘DBI:mysql:mydata’,’me’,’mypassword’);

    my $statement_handle = $db->prepare(‘SELECT * FROM mytable’);

    # Теперь эта команда готова к выполнению.

    My $statement_handle = $db->prepare(‘SELECT name, date FROM myothertable WHERE name like ?’);

    # Эта команда будет готовя к выполнению после подстановки # с использованием функции DBI::bind_param.

    DBI::quote принимает строку для использования в качестве запроса SQL и возвращает ее копию с правильно расставленными для ввода в запрос кавычками, в том числе расставляя корректные кавычки по концам строки.

    my $db1 = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

    my $db2 = DBI->connect(‘DBI:mysql:myotherdata’,’me’,’mypassword’);

    my $string = «Sheldon’s Cycle»;

    my $qs1 = $db1->quote($string);

    # $qs1: ‘Sheldon\’s Cycle’ (включая наружные кавычки)

    my $qs2 = $db2->quote($string);

    # $qs2 : ‘Sheldon’s Cycle’ (включая наружные кавычки)

    # Теперь обе строки годятся для использования в командах для своих

    # соответствующих серверов баз данных.

    Del: : rows возвращает число строк данных, содержащихся в описателе команды. Для DBD::mSQL и DBD::mysql эта функция дает точное число для всех команд, включая SELECT. Для многих других драйверов, которые не хранят в памяти сразу все результаты, эта функция надежно работает только для команд, не являющихся SELECT. Это следует учитывать при написании переносимых программ. Функция возвращает —1, если по какой-либо причине число строк неизвестно. Переменная $DBI: : rows выполняет ту же задачу.

    my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

    my $query = «SELECT name, date FROM myothertable WHERE name=’Bob'»;

    my $myothertable_output = $db->prepare($query);

    my $rows = $myotnertable_output->rows;

    print «В таблице ‘myothertable’ есть $rows строк ‘Воb’\n»;

    DBI: : state возвращает код ошибки SQL SQLSTATE последней по времени ошибки DBI. В данное время DBD::mSQL и DBD^mysql сообщают ‘S1000’ для всех ошибок. Эта функция доступна для описателей баз данных и команд. Переменная $ОВ1: : state выполняет ту же задачу.

    my $db = DBI->connect(‘DBI:mysql:mydata’,

    my $sql_error = $db->state;

    warn(«BoT последняя по времени ошибка DBI SQL: $sql_error»);

    DBI:: trace используется в основном для отладки. Если уровень трассировки установлен равным 2, выводится полная отладочная информация. Установка уровня 0 отключает трассировку. DBI->trace осуществляет трассировку для всех описателей, a $handle->trace — только для данного описателя — базы данных или команды. При наличии в DBI- >t race или $handle->trace второго аргумента отладочная информация выводится в указанный файл. Также трассировку можно включить, установив значение переменной окружения DBI_TRACE. Если переменная окружения установлена равной числу (в настоящее время 0 или 2), включается трассировка всех описателей на этом уровне. При другом значении переменной уровень трассировки устанавливается равным 2, а само значение используется в качестве имени файла для вывода отладочной информации.

    my $db1 = DBI->connect(‘DBI:mysql:mydata’,

    my $db2 = DBI->connect(‘DBI:mSQL:myotnerdata’,undef,undef);

    # Включена трассировка для всех описателей на уровне 2.

    # Отключена трассировка для $db2, но продолжает действовать для $db1

    # Теперь включена трассировка для всех описателей на уровне 2, выдача

    # посылается в файл ‘DBI.trace’.

    DBI::commit, DBI::rollback, DBI::ping

    DBI: :commit и DBI: : rollback полезны только при работе с серверами, поддерживающими транзакции. При работе с DBD::mSQL и DBD::mysql они не оказывают никакого эффекта. DBD: :ping пытается проверить, запущен ли сервер базы данных. В DBD::mSQL и DBD::mysql она не реализована.

    $statement_handle-> (только MySQL)

    $statement_handle-> (только MySQL)

    $statement_handle-> (только MySQL)

    $statement__handle-> (только MySQL и mSQL 1.x)

    $statement_handle-> (только MySQL)

    $statement_handle->

    В DBI.pm API определено несколько атрибутов, которые можно читать и устанавливать в любой момент. Присвоение значения атрибуту может определенным образом изменить поведение текущего соединения. Присвоение любого отличного от нуля значения атрибуту устанавливает его. Присвоение значения 0 атрибуту сбрасывает его. Некоторые значения определены только для конкретных баз данных и непереносимы. Ниже следуют атрибуты, применимые как к описателям баз данных, так и к командам.

    Этот атрибут оказывает влияние на поведение серверов баз данных, поддерживающих транзакции. Для mSQL и MySQL он всегда должен быть установлен (значение по умолчанию). Попытка изменить его прерывает выполнение программы.

    При установке этого атрибута отсекаются все ведущие и замыкающие пробелы в данных, возвращаемых запросом (например, при вызове DBI: : fetch row ). Все производные от данного описатели наследуют значение этого атрибута. Значение по умолчанию — «сброшен».

    Назначение этого атрибута — сохранить процесс при ветвлении (fork), чтобы дочерний процесс мог пользоваться родительским описателем. Его следует установить в родительском или дочернем процессе, но не в обоих. Значение по умолчанию — «сброшен».

    При установке этого атрибута выводятся все предупредительные сообщения. При сброшенном атрибуте доступ к ошибкам осуществляется только через $DBI: :errstr. Все производные от данного описатели наследуют значение этого атрибута. Значение по умолчанию -«установлен».

    При установке этого атрибута все ошибки возбуждают в программе исключительные ситуации, прерывая ее выполнение, если не определен обработчик ‘__DIE__’. Все описатели, производные от этого, наследуют значение этого атрибута. Значение по умолчанию -«сброшен».

    При установке этого атрибута выводятся предупредительные сообщения о неудачных приемах программирования (особенно пережитках Perl 4). Сброс этого атрибута отключает предупреждения DBI, что допустимо только при полной уверенности в своем мастерстве. Все производные от данного описатели (например, описатель команды, происходящий от описателя базы данных) наследуют значение этого атрибута. Значение по умолчанию — «установлен».

    Непереносимый атрибут, определенный только для DBD::mysql. Он возвращает из таблицы текущее значение поля auto_increment (если таковое имеется). Если поле auto_increment не существует, атрибут возвращает undef.

    Это непереносимый атрибут, определенный только для DBD::mysql. Атрибут возвращает ссылку на массив булевых значений, указывающих для каждого из содержащихся в описателе команды полей, имеет ли оно тип BLOB. Для описателя команды, который был создан не выражением SELECT, $statement_handle-> возвращает undef.

    Непереносимый атрибут, определенный только для DBD::mysql. Он возвращает ссылку на массив булевых значений, указывающих для каждого из содержащихся в описателе команды полей, определено ли оно как KEY. Для описателя команды, который был создан не выражением SELECT, $statement_handle-> возвращает undef.

    Это непереносимый атрибут, определенный только для DBD::mSQL и DBD::mysql. Он возвращает ссылку на массив булевых значений, указывающих для каждого из содержащихся в описателе команды полей, определено ли оно как ‘NOT NULL’ . Для описателя команды, который был создан не выражением SELECT, данный атрибут возвращает undef. Того же результата можно достичь в переносимом виде, используя $statement_handle-> .

    Это непереносимый атрибут, определенный только для DBD::mSQL и DBD::mysql. Атрибут возвращает ссылку на массив булевых значений, указывающих для каждого из содержащихся в описателе команды полей, имеет ли оно числовой тип. Для описателя команды, созданного не выражением SELECT, $statement_handle-> возвращает undef.

    Это непереносимый атрибут, определенный только для DBD::mSQL и DBD::mysql. При использовании с DBD::mSQL он оказывает влияние только для серверов mSQLl.x, поскольку mSQL2.x не использует первичные ключи. Атрибут возвращает ссылку на массив булевых значений, указывающих для каждого из содержащихся в описателе команды полей, является ли оно первичным ключом.

    Для описателя команды, созданного не выражением SELECT, данный атрибут возвращает undef.

    Непереносимый атрибут, определенный только для DBD::mSQL и DBD::mysql. Этот атрибут возвращает ссылку на список максимально допустимых размеров полей, содержащихся в описателе команды. Для описателя команды, который был создан не выражением SELECT, $statement_handle-> возвращает undef.

    Это непереносимый атрибут, определенный только для DBD::mysql. Атрибут возвращает ссылку на список фактических максимальных размеров полей, содержащихся в описателе команды. Для описателя команды, который был создан не выражением SELECT, данный атрибут возвращает undef.

    Атрибут возвращает ссылку на список имен полей, содержащихся в описателе команды. Для описателя команды, который был создан не выражением SELECT, $statement_handle-> возвращает undef.

    Этот атрибут возвращает ссылку на массив булевых значений, указывающих для каждого из содержащихся в описателе команды полей, может ли оно иметь значение NULL. Поле, определенное как ‘NOT NULL’, даст в списке значение 0. Остальные поля дадут значение 1. Для описателя команды, созданного не выражением SELECT, атрибут возвращает undef.

    Атрибут возвращает число колонок данных, содержащихся в описателе команды. Для описателя команды, который был создан не выражением SELECT, $statement_handle-> возвращает 0.

    Этот атрибут возвращает число меток-заместителей в описателе команды. Метки-заместители обозначаются в команде символом ‘?’. Для подстановки вместо меток-заместителей надлежащих значений используется функция DBI: : bind_values .

    $statement_handle->

    Это непереносимый атрибут, определенный только для DBD::mSQL и DBD::mysql. Атрибут возвращает ссылку на список имен таблиц, к которым осуществлялся доступ в запросе. Полезно использовать для SELECT с соединением нескольких таблиц.

    Непереносимый атрибут, определенный только для DBD::mSQL и DBD::mysql. Он возвращает ссылку на список типов полей, содержащихся в описателе команды. Для описателя команды, созданного не выражением SELECT, $statement_handle-> возвращает undef. Значениями списка являются целые числа, соответствующие перечислению в заголовочном файле С mysql_com.h из дистрибутива MySQL. Сейчас способа доступа к именам этих типов из DBI не существует. Но доступ к типам возможен через функцию &Mysql: : FIELD_TYPE_ * в Mysql.pm. В DBD::mysql имеется также недокументированный атрибут $statement_handle-> , идентичный $statement_handle- > , за исключением того, что вместо целых чисел возвращает SQL-названия типов. Следует подчеркнуть, что это недокументированный атрибут, и автор DBD::niysql высказал свое намерение убрать его, как только в DBI будет реализована такая же функция.

    Все эти атрибуты не поддерживаются в DBD::mSQL и DBD::mysql. Присвоение им значений ничего не даст, а чтение возвратит 0 или undef. Исключение составляет атрибут $statement_handle-> . В настоящее время любое обращение к нему «убьет» программу.

    my $db = DBI->connect(‘mysql:mydata’,’me’,’mypassword’);


    # Теперь любая ошибка DBI/DBD убьет программу.

    my $statement_handle = $db->prepare(‘SELECT * FROM mytable’);

    # @fields содержит теперь список с именами всех полей в ‘mytable’.

    Это объявление должно быть в любой программе Perl, использующей модуль Msql.pm.

    $db = Msql->connect($host, Sdatabase);

    Устанавливает соединение между вашей программой на Perl и сервером Msql. У этой функции три версии. При отсутствии аргументов соединение устанавливается с сонетом Unix Msql на локальном узле без указания базы данных. Это наиболее эффективное соединение. Если задан один скалярный аргумент, он рассматривается как имя узла или IP-адрес сервера mSQL. Производится соединение с этим сервером без указания базы данных. Если присутствуют два скалярных аргумента, то первый рассматривается как имя узла сервера mSQL, а второй — как имя требуемой базы данных. Программа устанавливает соединение с указанным сервером и выбирает указанную базу данных. Возвращаемое значение является ссылкой на объект, называемый описателем базы данных (database handle). Вся связь с самим сервером базы данных происходит через этот объект. В случае невозможности установить соединение, все версии функции возвращают undef, и в $Msql: :db_errstr помещается сообщение об ошибке.

    # Соединение с сокетом Unix локального узла ‘ my $db = Msql->connect;

    # Соединение с узлом ‘www.myserver.com’ без указания, базы данных

    mу $db = Msql->connect(‘www.myserver.com’);

    # Соединение с сервером ‘www.myserver.com’ и выбор базы данных ‘mydata’

    mу $db = Msql->connect(‘www.myserver.com’,’mydata’);

    Msql: : createdb создает базу данных, имя которой принимает в качестве аргумента. Запрос на создание посылается серверу mSQL. Команда посылается от имени пользователя, запустившего CGT-программу. Поэтому для успешного использования в программе CGI последняя должна быть запущена пользователем, имеющим право создания баз данных. Функция возвращает -1 при неудаче и 0 в случае успеха.

    my $db = Msql->connect;

    my $my_new_database = ‘mynewdata’;

    my $result = $db->createdb($my_new_database);

    die «База данных не создана!»

    print «$my_new_database создана.\n»;

    Msql: database возвращает имя текущей базы данных как скаляр. Функция возвращает undef, если нет выбранной базы данных.

    my $db = Msql->connect(‘www.myserver.com’,’mydata’);

    my $database = $db->database;

    print «Здесь должно быть выведено ‘mydata’: $database\n»;

    Msql: :dropdb принимает в качестве аргумента имя базы данных, которую нужно удалить. Затем она посылает запрос на удаление серверу mSQL. Команда посылается от имени пользователя, запустившего CGI-программу. Поэтому для успешного использования в программе CGI она должна быть запущена пользователем, имеющим право создания баз данных. Функция возвращает -1 при неудаче и 0 в случае успеха. Она не просит подтверждения, и ее результат становится постоянным, поэтому ее следует использовать с крайней осторожностью.

    my $db = Msql->connect;

    my $result = $db->dropdb(‘mydata’);

    die «Команда не выполнена!»

    print «‘mydata’ потеряна навсегда.\n»;

    Msql::errmsg возвращает последнюю по времени ошибку сеанса работы с сервером mSQL. Значение сохраняется, пока не произойдет следующая ошибка, и тогда заменяется новым. Если во время сеанса не произошло ошибки, функция возвращает undef.

    my $db = Msql->connect;

    my Serror = $db->errmsg;

    warn(«Вот последняя по времени ошибка mSQL: $error»);

    ($step, $value) = $db->getsequenceinfo($table);

    Msql: :getsequenceinfo принимает в качестве аргумента имя таблицы. Функция возвращает шаг и значение последовательности, если она определена в таблице. Если в указанной таблице не определена последовательность, то возвращается неопределенное значение undef, и в Msql: :errmsg помещается ошибка.

    my $db = Msql->connect;

    my ($step, $value) = $db->getsequenceinfo(‘mytable’);

    die «B mytable не задана последовательность» if not $step;

    print «B mytable есть последовательность со значением $value и шагом

    Msql: :host возвращает имя узла сервера базы данных как скаляр. Не гарантируется возврат канонического или хотя бы полностью квалифицированного доменного имени. В действительности, хотя это и не документировано, Msql:: host возвращает ту самую строку, которая передавалась серверу при вызове Msql::connect . Это согласуется и с тем, что Msql:: host возвращает undef, если использовалась форма Msql: : connect без аргументов.

    my $ijh — Msql->connect( ‘www.myserver.com’);

    my $host = $db->host;

    print «Вероятно, вы видите ‘www.myserver.com’: $host\n»;

    Msql: :listdbs возвращает список имеющихся на сервере баз данных. Если баз данных нет, она возвращает пустой массив.

    my $db = Msql->connect;

    my @databases = $db->listdbs;

    print «Имеющиеся базы данных:\n\n» . join(«\n»,@databases);

    Msql:: listf ields принимает в качестве аргумента имя таблицы в текущей базе данных. Она возвращает ссылку на объект, который содержит имена всех полей и некоторые другие сведения. Эта ссылка известна как описатель команды (statement handle). Содержащиеся в нем данные можно извлечь с помощью функций Msql::Statement: :as_string, Msql::Statement: :listindices (только mSQL2.0), Msql: Statement: :numfields , Msql::Statement::table , Msql::Statement::name , Msql::Statement::type , Msql::Statement::isnotnull , Msql::Statement::isprikey , Hsql::Statement::isnum и Msql::Statement: .’length . Если таблицы не существует, функция возвращает неопределенное значение undef, и в Msql: :errmsg помещается ошибка. В описании Msql: :Statement: :fetchhash можно видеть прием, который делает данную функцию несколько устаревшей.

    my $db = Msql->connect;

    my $fields = $db->listfields(‘mytable’);

    warn («Проблемы с ‘mytable-‘: » . $db->errmsg)

    # $fields явяется ссылкой на все поля в таблице ‘mytable’.

    print «mytable содержит следующие поля:\n»;

    Msql: : listindex принимает в качестве аргументов имена таблицы и индекса и возвращает массив описателей команд, содержащих данные о каждом из индексов. Хотя, согласно документации, эта функция возвращает массив описателей команд, всегда возвращается не более одного описателя. Поэтому, вероятно, можно рассматривать эту функцию как возвращающую скалярный описатель команды. Это описатель в том же стиле, что и возвращаемый Msql::query , и может обрабатываться теми же функциями. Если индекс не существует, возвращается неопределенное значение undef. В возвращаемой таблице данных об индексе одна колонка с именем «Index». В первой строке указан тип индекса, который в mSQL2.0 всегда «avl». Остальные строки суть имена полей, составляющих индекс. Эта функция применима только к mSQL версий 2.0 и выше.

    my $db = Msql->connect;

    my $mytable_fields = $db->listfields(‘mytable’);

    my @indices = $mytable_fields->listindices;

    # Я знаю имена всех индексов.

    my $index_info_handle = $db->listindex(‘mytable’,$_);

    my (@index_info) = $index_info_handle->fetchcol(0);

    my $type_of_index = shift(@index_info);

    # $type_of_index содержит теперь тип индекса (вероятно, ‘avl’),

    # a @index_info содержит теперь список полей в индексе.

    Msql: :listtables возвращает массив таблиц, имеющихся в базе данных. Если в базе данных нет таблиц, функция вернет пустой массив.

    my $db = Msql->connect;

    my @tables = $db->listtables;

    my $database = $db->database;

    print «B $database есть следующие таблицы:\n\n» join(«\n»,@tables);

    Msql::query является самой важной и наиболее часто используемой функцией в Msql.pm API. В действительности вы посылаете SQL-запросы серверу базы данных через эту функцию. Функция принимает в качестве аргумента скалярную строку, содержащую SQL-запрос. Если запрос является выражением SELECT, то она возвращает описатель команды, содержащий результаты выполнения запроса. В противном случае функция вернет число строк, измененных запросом. С описателем команды работают те же самые функции, которые были перечислены для Msql:: listf ields (за исключением Msql:: Statement:: listindices ), a также следующие: Msql::Statement: :fetchrow , Msql::Statement::fetched , Msql::Statement::fetchhash , Msql: Statement::numrows , Msql::Statement::maxlength и Msql: Statement: :dataseek . Если по какой-либо причине запрос был неудачным, возвращается значение undef и в Msql: :errmsg помещается ошибка. Каждый описатель команды содержит выходные данные отдельного запроса, поэтому можно послать системе много запросов и работать с каждым описателем команды, когда заблагорассудится.

    my $db = Msql->connect; $db->selectdb(‘mydata’);

    my $query1 = «SELECT * FROM mytable»;

    my $query2 = «SELECT name, date FROM myothertable WHERE name LIKE ‘Bob%'»;

    my $query3 = «UPDATE myothertable SET name=’Bob’ WHERE name=’Joe'»;

    my $mytable_output = $db->query($query1);

    my $myothertable_output = $db->query($query2);

    my $myothertable_input = $db->query($query3);

    # $mytable_output содержит результаты запроса к ‘mytable’

    # $myothertable_output содержит результаты запроса к ‘myothertable’

    print «Обновление ‘myothertable’ повлияло на имена в $myothertable_input

    Если переменная $Msql: : QUIET установлена в true, то параметр -w в Perl отключает вывод ошибок. В противном случае все ошибки MsqlPerl будут автоматически посылаться на STDERR. Переменную можно в любой момент сбросить. Функция вывода сообщений об ошибках по -w настолько полезна, что не рекомендуется устанавливать $Msql: : QUIET .

    # Отключить сообщения об ошибках. Действует, только если сценарий

    # Выполняем многословную часть.

    # Снова включаем сообщения об ошибках. $Msql::QUIET = undef;

    Msql: :quote принимает в качестве аргумента скалярную строку. Она возвращает ту же строку, но с правильной расстановкой кавычек, пригодную для вставки в поле базы данных типа CHAR или TEXT. Более точно, строка заключается в одиночные кавычки, а одиночные кавычки внутри строки предваряются управляющим символом «обратная косая черта». Если задан второй аргумент, результирующая строка укорачивается до заданной длины.

    my $db = Msql->connect;

    my $string = «Это ‘ (одинарная кавычка)»;

    my $qstring = $db->quote($string);

    print qq%Tenepb значение строки «‘Это\\’ (одинарная кавычка)'» : $qstring\n%;

    Msql: :selectdb выбирает базу данных на сервере. В случае неуспеха в Msql: :errmsg помещается ошибка. Единственный действенный способ проверить успешность выполнения функции — посмотреть значение $db->database и сравнить его с той базой данных, с которой вы хотели соединиться. В любой момент выполнения программы можно переключиться между базами данных.

    my $db = Msql->connect;

    # Выбранной базой данных является ‘mydata’

    if ($db->database ne ‘mydata’) <

    wаrn(‘Базу данных выбрать не удалось!’); >

    # Теперь выбрана база данных ‘myotherdata’

    Msql: : shutdown посылает на сервер mSQL команду остановки. Команда посылается от имени пользователя, запустившего программу, поэтому для использования в CGI-программе последняя должна запускаться пользователем, имеющим право остановки сервера баз данных. Функция возвращает -1 при неудаче и 0 в случае успеха.

    my $db = Msql->connect;

    # Пора закрывать базу данных.

    my $result = $db->shutdown;

    die «Команда не выполнена!» if $result — -1;

    print «Сервер остановлен.\n»;

    Msq1: :Statement: :as_string возвращает данные, содержащиеся в описателе команды, в виде аккуратно отформатированной таблицы ASCII. Таблица аналогична тем, которые выводит монитор msql. Программа pmsql, поставляемая с модулем Msql.pm, использует эту функцию для создания своих таблиц.

    my $db = Msql->connect;

    my $query = «SELECT * FROM mytable»;

    my $mytable_output = $db->query($query);

    print «Моя таблица:\n», $mytable_output->as_string;

    # Выводится вся таблица в гораздо более приемлемом виде,

    # чем в примере Msql:[Statement:ifetchhash.

    Msql: :Statement: :dataseek принимает в качестве аргумента номер строки. Функция переустанавливает данные, так что следующий вызов Msql: :Statement: :fetchrow или Msql: Statement: :fetchhash возвращает данные указанной строки. Если указанный номер строки выходит за границы таблицы, указатель устанавливается на конец таблицы и при следующем вызове будет возвращено неопределенное значение undef. Первая строка таблицы имеет номер 0.

    my $db = Msql->connect;

    my Squery = «SELECT name, date FROM myothertable»;

    my $myothertable_output = $db->query($query);

    my @names = $myothertable_output->fetchcol(0);

    my @dates = $myothertable_output->fetchcol(1);

    # Теперь указатель установлен в конце таблицы.

    # Теперь указатель установлен на начало таблицы,

    print «Это первая строка данных: «, $myothertable_output->fetchrow, «\n».

    Msql: :Statement: :fetched принимает в качестве аргумента номер колонки и возвращает массив всех значений, находящихся в этой колонке. Каждый вызов возвращает значения в колонке в одинаковом порядке, поэтому значения с одинаковым номером элемента находятся в одной строке данных. Первая выдаваемая колонка имеет номер 0. Для выполнения этого вызова модуль должен считать всю таблицу, поэтому, если вы хотите продолжить просмотр таблицы после вызова этой функции, переустановите данные с помощью Msql::Statement: :dataseek . Если задан недопустимый номер колонки, возвращается неопределенное значение undef.

    my $db = Msql->connect;

    my $query = «SELECT name, date FROM myothertable WHERE name LIKE ‘Bob%'»;

    my $myothertable_output = $db->query($query);

    my @names = $myothertable_output->fetchcor(0);

    # @names содержит теперь все имена.

    my @dates = $myothertable_output->fetchcol(1);

    # ©dates содержит теперь все даты.

    print «Row $_: $names[$_], $dates[$_]\n»; >

    Msql::Statement: :fetchhash возвращает текущую строку описателя команды как ассоциативный массив (или хэш). Ключами хэша служат имена полей, а значениями — значения данных текущей строки. Каждое последующее обращение к функции возвращает очередную строку данных. Когда данных больше нет, функция возвращает неопределенное значение undef.

    my $db = Msql->connect;

    my $query = «SELECT * FROM mytable»;

    my $mytable_output = $db->query($query);

    my %first_data_row = $mytable_output->fetchhash;

    my @fields = keys %first_data_row;

    # @fields содержит теперь имена всех полей. В результате, фактически нет

    # нужды использовать Msql::listfields, поскольку ее данные и многие

    If другие можно получить через описатель команды, возвращаемый

    print join(«», values(%first_data_row);

    print join(«», values(%data_row)) while %data_row = $mytable_output-

    # Таким образом распечатывается вся таблица, хотя и в невыравненном

    @row_of_data = $statement_handle->fetch row;

    Msql:: Statement: : fetch row возвращает очередную строку данных из описателя команды, созданного Msql:.-query. Каждое последующее обращение к Msql: Statement: :fetchrow возвращает очередную строку данных. Когда данных больше нет, функция возвращает неопределенное значение undef. Элементы в результирующем массиве упорядочены в соответствии с исходным запросом. Если запрос имел вид SELECT*FROM . , то элементы упорядочиваются в соответствии с последовательностью определения полей в таблице.

    my $db = Msql->connect;

    my $query1 = «SELECT * FROM mytable»;

    my $query2 = «SELECT name, date FROM myothertable WHERE name LIKE

    my $mytable_output = $db->query($query1);

    my $myothertable_output = $db->query($query2);

    # Чтение строк данных будет продолжаться,

    # пока их больше не останется.

    print «Строка «,$i++,»: «.join(‘, ‘,@mytable_rows).»\n»;

    # Если неизвестна структура таблицы ‘mytable’,

    # нельзя узнать число элементов в @mytable_rows или их порядок.

    # Это первая строка данных в $myotrertable_output.

    ($name, $datc) = $myothertaPle_output->fetchrow;

    # Это следующая строка.

    ($name, $date) = $myothertable_output->fetchrow;

    my @name_and_date = $myothertable_output->fetchrbw;

    Msql:: Statement: :isnotnull возвращает список булевых значений, указывающих для каждой из содержащихся в описателе команды колонки, была ли она определена как ‘NOT NULL’. При вызове в скалярном контексте функция возвращает ссылку на массив.

    my $db = Msql->connect;

    my Soutput = $db->query(«select * from mydata»);

    my @names = $output->name;

    my @not_null = $output->isnotnull;

    print «$names[$_]не может быть null\n»

    Msql: : Statement: : isnum возвращает список булевых значений, указывающих для каждой из содержащихся в описателе команды колонки, является ли она числовой. При вызове в скалярном контексте функция возвращает ссылку на массив. «Числовая» означает тип, например, ‘INT’ или ‘REAL’, но не число в поле типа ‘CHAR’ или ‘TEXT’.

    my $db = Msql->connect;

    my $output = $dD->query(«select name, date from myothertable»);

    print «Name является числом»

    print «Date является числом»

    Msq1::Statement: :isprikey возвращает список булевых значений, указывающих для каждой из содержащихся в описателе команды колонки, является ли она первичным ключом. При вызове в скалярном контексте функция возвращает ссылку на массив. Эта функция всегда возвращает список, состоящий из нулей, при соединении с сервером mSQL 2, поскольку в mSQL 2 не используются первичные ключи. Однако она может быть полезна с серверами mSQL 1, поскольку в них реализованы первичные ключи.

    my $db = Msql->connect;

    my $output-= $db->query(«select * from mytable»);

    my @prikeys = $output->isprikey;

    my $number_of_prikeys = scalar @prikeys;

    print «В этом описателе команды $number_of_prikeys первичных ключей. «,

    «В запросе участвует не меньшее число различных таблиц, поскольку «.

    «в каждой таблице может быть только один первичный ключ\n»;

    Msql::Statement::length возвращает список максимально возможных длин для колонок, содержащихся в описателе команды. Это значения, определенные как максимальные при создании таблицы. При вызове в скалярном контексте функция возвращает ссылку на массив.

    my $db = Msql->connect;

    my $output = $db->query(«select- * from mytable»);

    my @types = $output->type;

    my @lengths = $output->length;

    if ($types[$_] == &Msql: :CHAR_TYPE and $lengths[$_] > 1000000) <

    print «В этой таблице у вас есть одно о-очень большое поле CHAR!\»;

    Msql: : Statement: :listindices возвращает индексы, связанные с какими-либо полями в описателе команды. Поскольку функция непосредственно ищет имена полей, она полезна только для имен, возвращаемых Msql: : listf ields . Если индексы не обнаружены, возвращается неопределенное значение undef. Эту функцию можно использовать только с серверами mSQL 2.0 или последующих версий.

    my $db = Msql->connect;

    my $mytable_fields = $db->listfields(‘mytable’);

    my ©indices = $mytable_fields->listindices;

    print «B ‘mytable’ есть следующие индексы: » . join(«, «,@indices) .

    Msql::Statement: :maxlength возвращает список фактических максимальных размеров всех полей таблицы. При вызове в скалярном контексте функция возвращает ссылку на массив. Поскольку сервер mSQL прямо не сообщает эти данные, она реализована путем чтения всей таблицы и поиска максимального значения для каждого поля. Поэтому в mSQL эта функция может потребовать много ресурсов, если запрос возвращает большой объем данных.

    my Soutput = $db->query(‘select name, date from myothertable’);

    print «Самое длинное имя имеет длину » . $ouput->maxlength->[0] . » символов,\n»;

    Msql:: Statement:: name возвращает имена колонок данных, содержащихся в описателе команды. При вызове в скалярном контексте функция возвращает ссылку на массив. Как и для Msql::Statement::table , скалярное значение этого списка (в противоположность значению функции при вызове в скалярном контексте) совпадает со значением Msql::Statement::numfields

    my $db = Msql->connect;

    my $output = $db->query(«select * from mytable»);

    my @column_names = $output->names;

    # Теперь @column_names — список колонок ‘mytable’

    Msql:: Statement: : numf ields возвращает число полей в каждой строке результирующих данных, содержащихся в описателе команды. Во всех выходных данных есть хотя бы одно поле, поэтому данная функция возвращает положительное число для всех определенных описателей команд.

    my $db = Msql->connect;

    my $output = $db->query(«select * from mytable»);

    my $numfields = $output->numfields;

    my $numrows = $output->numrows;

    print «В каждой строке таблицы ‘mytable’ $numfields полей \n»;

    print «Всего имеется Snumrows строк данных. Поэтому ‘mytable’\n»;

    print «содержит» . ($numfields*$numrows) . » элементов данных.\n»;

    Msql: : Statement: : numrows возвращает число строк, содержащихся в описателе команды. Для описателя, который не может содержать строк, например, возвращаемого Msql: :listfields , функция возвращает строку ‘N/A.’ Если описатель может содержать строки, но их нет — например, он возвращен SELECT, для которого не найдено соответствия, -функция возвращает 0.

    my $db = Msql->connect;

    my Soutput = $db->query(«select * from mytable»);

    my $numrows = ‘$output->numrows;

    print «B ‘mytable’ содержится $numrows строк данных\n»;

    Msql: :Statement: :table возвращает список таблиц, связанных с колонками данных, содержащимися в описателе команды. (См. выше в Msql: : Statement: : isnum пример использования ссылки на массив.) Даже если запрос использовал только одну таблицу, для каждой колонки есть один элемент. Побочным эффектом является то, что скалярное значение массива, возвращаемого $statement_handle->table , совпадает со значением $statement_handle->numfields .

    my $db = Msql->connect;

    my Soutput = $db->query(‘select myothertable. name, myothertable.date,

    mythirdtable. name from myothertable, mythirdtable where myothertable. name

    my @tables = $output->table;

    # @tables содержит теперь (‘myothertable’, ‘myothertable’, ‘mythirdtable’)

    Msql: : Statement: : type возвращает типы колонок данных, содержащихся в описателе команды. При вызове в скалярном контексте функция возвращает ссылку на массив. Сам по себе этот массив не очень интересен для большинства пользователей (в текущей реализации это массив целых чисел), однако эти значения можно сравнивать со встроенными значениями, определенными в Msql.pm, такими как &Msql: : CHAR_TYPE и &Msql: : INT_TYPE. Один из путей использования этих данных — создание массива с читаемыми названиями, соответствующими предустановленным типам. Этот метод был продемонстрирован в главе 10 «Perl». Другой способ показан ниже.

    my $db = Msql->connect;

    my $output = $db->query(«select name, date from myothertable»);

    my ($name_type, $date_type) = $output->type;

    $_ eq &Msql: :CHAR_TYPE and do <

    print »name является CHAR’;

    > $_ eq &Msql::INT_TYPE and do <

    print ‘name является INT’; last; > # и т.д.

    # повторить для $date_type

    Msql::sock возвращает скаляр, содержащий номер сокета, использованного для подключения к серверу mSQL. Обычно это полезно только при действительно изощренном программировании.

    my $db = Msql->connect;

    my $sock = $db->sock;

    print «Я подключен к сокету $sock.\n»;

    Msql.pm предоставляет следующие функции, соответствующие типам данных mSQL:

    &Msql::CHAR_TYPE &Msql::INT_TYPE &Msql::REAL_TYPE &Msql::IDENT_TYPE

    &Msql::TEXT_TYPE &Msql::IDX_TYPE &Msql::NULL_TYPE &Msql::DATE_TYPE

    &Msql::UINT_TYPE &Msql::MONEY_TYPE &Msql::TIME_TYPE &Msql::SYSVAR_TYPE

    ‘CHAR’ => &Msql::GHAR_TYPE, ‘INT’ => &Msql::INT_TYPE, ‘REAL’ => &Msql::REAL_TYPE, ‘SYSVAR’ => &Msql::SYSVAR_TYPE, ‘TIME’ => &Msql::TIME_TYPE, ‘MONEY’ => &Msql::MONEY_TYPE, ‘UINT’ => &Msql::UINT_TYPE, ‘TEXT’ => &Msql::TEXT_TYPE, ‘NULL’ => &Msql::NULL_TYPE, ‘DATE’ => &Msql::DATE_TYPE, ‘IDENT’ => &Msql::IDENT_TYPE, ‘IDX’ => &Msql::IDX_TYPE,

    # $types <'CHAR'>является теперь легкодоступным псевдонимом для

    # &Msql::CHAR_TYPE. Наличие значений в %types дает доступ ко всем

    # удобным функциям работы с хешами, такими как keys() и values().

    В переменной $Msql:: VERSION содержится номер версии модуля Msql.pm.

    print «Вы используете Msql.pm версии $Msql::VERSION.\n»;

    Mysql.pm API идентичен Msql API (с заменой всюду «Msql» на «Mysql»), за исключением следующих отличий:

    $db = Mysql->connect($host, Sdatabase, $user, $password);

    Помимо трех методов соединения, совпадающих с Msql: :connect , в Mysql:: connect есть четвертый метод, требующий передачи пароля в качестве дополнительного аргумента. Первый аргумент — имя узла или IP-адрес сервера MySQL. Если в качестве этого аргумента передается undef, модуль соединяется с сонетом Unix на локальном узле. Второй аргумент является именем первоначально выбираемой базы данных. Его всегда можно впоследствии изменить с помощью Mysql: :selectdb . Можно передать undef в качестве второго аргумента, чтобы не выбирать исходной базы данных. Третий аргумент является именем пользователя для соединения с базой данных. Для успешного соединения имя пользователя должно присутствовать в таблицах доступа MySQL. Последний аргумент является паролем пользователя.

    $db = Mysql->connect(undef,’mydata’,’webuser 1 , ‘super_secret_squirrel’);

    # Теперь описатель базы данных соединен с локальным сервером MySQL и

    # использует базу данных ‘mydata 1 .

    # Использовано имя пользователя ‘webuser’ для

    # соединения с паролем ‘super_secret_squirrel’.

    Mysql: :errno возвращает код последней ошибки. Код соответствует сообщению об ошибке, возвращаемому Msql: : errmsg .

    my $db = Mysql->connect(undef,’mydata’,’webuser’, ‘super_secret_squirrel’);

    # В этом запросе есть синтаксическая ошибка.

    my $output = $db->query( ‘SELECT * from mydata’);

    print «Ошибка » . $output->errno . «: » . $output->errfnsg . «\n»; >

    Помимо функций типов данных Mysql: :TYPE_ *, идентичных функциям Msql::TYPE *, Mysql.pm предоставляет следующие дополнительные функции типов данных:

    &Mysql::FIELD_TYPE_BLOB &Mysql::FIELD_TYPE_CHAR &Mysql::FIELD_TYPE_DECIMAL &Mysql::FIELD_TYPE_DATE &Mysql::FIELD_TYPE_DATETIME &Mysql::FIELD_TYPEJ)OUBLE &Mysql::FIELD_TYPE_FLOAT &Mysql: : FIELD_TYPE_INT24 &Mysql::FIELD_TYPE_LONGLONG &Mysql::FIELD_TYPE_LONG_BLOB &Mysql::FIELD_TYPE_LONG &Mysql::FIELD_TYPE_MEDIUM_BLOB &Mysql::FIELD_TYPE_NULL &Mysql::FIELD_TYPE_SHORT &Mysql::FIELD_TYPE_STRING &Mysql::FIELD_TYPE_TIME &Mysql::FIELD_TYPE_TIMESTAMP &Mysql::FIELD_TYPE_TINY_BLOB &Mysql::FIELD_TYPE_VAR_STRING

    my $db = Mysql->connect(undef, ‘mydata’);

    my Soutput = $db->query(«SELECT name, data from myothertable»);

    if ($output->type->[0] = &Mysql::FIELD_TYPE_STRING) <

    print «Name является STRING.\n»; >

    Msql: :Statement: :affectedrows возвращает число строк, обработанных запросом. Эта функция полезна, поскольку Mysql.pm возвращает описатель команды для запросов, не являющихся командами SELECT.

    my $db = Mysql->connect(undef,’mydata’);

    my $output = $db->query(«UPDATE mytable set name=’bob’ where

    print $output->affectedrows . » строк обновлено.\n»;

    Mysql: : Statement:: info возвращает дополнительные результаты некоторых запросов, для которых в Mysql.pm нет специальных функций, таких как ALTER TABLE и LOAD DATA INFILE . Например, при использовании LOAD DATA INFILE функция Mysql: : Statement:: info возвращает число вставленных записей, число удаленных, число пропущенных и число элементов, которые невозможно синтаксически разобрать.

    my $output = $db->query(«LOAD DATA INFILE ‘mydata.dat’ INTO TABLE mytable»);

    my $info = $output->info($output);

    print «Результат работы LOAD DATA: $info\n»;

    Функция Mysql::Statement::insertid возвращает текущее значение поля auto_increment (если такое имеется) в таблице. Если в таблице нет поля auto_increment , она возвращает неопределенное значение undef.

    my $db = Mysql->connect(undef,’mydata’);

    my $output = $db->query(

    «INSERT into mytable (id, name, date) VALUES (»,’bob’, ‘today’)»;

    my $new_ >insertid;

    print «Bob был введен с ID, равным $new_id.\n»;

    Mysql: : Statement:: isblob возвращает список булевых значений, указывающих на то, имеют ли содержащиеся в описателе команды поля тип BLOB. При вызове в скалярном контексте функция возвращает ccылку на массив.

    my $output = $db->query(‘SELECT name, data from myothertable’);

    print «Name является полем BLOB.\n»; >

    print «Name не является полем BLOB.\n»; >

    В отличие от MsqLpm, Mysql.pm возвращает описатель команды даже для запросов, не являющихся командами SELECT, например, для запросов INSERT, UPDATE и DELETE.

    my $db = Mysql->connect(undef,’mydata’);

    my $outpuf= $db->query(«UPDATE mytable set name=’joe’ where

    # $output является описателем команды.

    Cборник часто задаваемых вопросов по языку PERL и программированию для WEB

    CБОРНИК ЧАСТО ЗАДАВАЕМЫХ ВОПРОСОВ ПО ЯЗЫКУ PERL И ПРОГРАММИРОВАНИЮ ДЛЯ WEB

    Текущий координатор: Павел Аммосов
    Составление FAQ начато: 20 окт 1998
    Текущаяя версия от: 17 Apr 1999 22:16
    Адрес FAQ в Internet: http://isabase.philol.msu.ru/

    Общий план

    Часть С. Perl и базы данных

    (1) БД на плоских файлах

    (Q 1.1) Я хочу какую-нибудь простейшую БД и прямо сейчас!
    (A) Вы можете использовать простой текстовый файл с разделителями. Например, если мы пишем нечто типа телефонной книги, то вполне вероятно предположить, что ни в чьем имени, ни в номере телефона не встретится последовательность . так что именно ее и можно использовать в качестве разделителей.
    Файл с данными может выглядеть так: тогда программа, которая читает данные, может быть примерно такого вида: Больше проблем возникает в случее, если надо удалить или отредактировать запись, но и их можно довольно просто и элегантно решить, если использовать механизм редактирования на месте (inplace edit) — при использовании операции «ромб»(<>), можно читать из одного файла, а писать в другой: если запустить это программу как

    ,то в текущем каталоге будут два файла: data.dat, с записями, которые удовлетворили нашим условиям и data.dat

    — предыдущая копия.
    (также, во многих случаях, всю программу такого типа можно записать как one-liner: )

    Для чтения двоичных файлов в Perl можно использовать функции read и unpack. К примеру, если использовать двоичный файл для хранения телефонной книги такого формата: то строка описания формата для unpack будет выглядеть так: а сама программа, аналогичная первому примеру: Чтобы вывести в файл такую запись можно использовать конструкцию типа (Q 1.2) Можно ли как-нибудь из Perl получить доступ к dbf файлам?
    (A) Да, можно. На http://www.fi.muni.cz/

    adelton/ есть модуль XBase, который позволяет читать/писать dbf. При чтении он даже поддерживает индексы. Кроме того, в комплект поставки также входит модуль DBD::XBase, при помощи которого можно даже оперировать dbf на SQL.

    (Q 1.3) А к MS access .mdb?
    (A) К файлам MS Access нельзя обращаться из perl напрямую, по крайней мере, в настоящее время.
    К MS Access можно обращаться по ODBC, при помощи DBD::ODBC.

    (Q 1.4) Зачем и как нужно запирать (lock) файлы? (A) Представьте себе ситуацию когда одновременно работают несколько копий одной и той же программы (к примеру, cgi-скрипты, обслуживающие запросы), читающие/пишушие в один файл, тогда рано или поздно создатся ситуация при которой один скрипт прочитал данные, произвел над ними некоторые действия и собрался записать их назад в файл, но в это же время другой скрипт тоже прочитал данные, тоже произвел над ними действия, но (!) он прочитал старые данные, которые он и запишет поверх данных, выданных другим скриптом. Таким образом, в файле остануться данные записаные одним из скриптов — в лучшем случае, в худшем — структура файла будет испорчена. Чтобы этого избежать в Unix и большинстве других ОС есть системный вызов flock(2) или аналогичный.

    Как использовать flock
    К примеру, скрипт который записывает имена вызывающих хостов в файл. (На деле такой список, конечно, можно получить из журнала регистрации web-сервера). Более подробный рассказ о flock и пример доступны на http://w3.stonehenge.com/merlyn/WebTechniques/col04.html

    Чего делать на системах, где нет flock или для блокировок файлов на сетевых дисках?

    Судя по perlfaq5(1), можно использовать модуль File::Lock с CPAN.

    (2) Реляционные, пост-реляционные и объектно-реляционные СУБД

    (Q 2.1) Как использовать DBI?
    (A) DBI — это интерфейс прикладных программ к СУБД, использующим SQL в качестве языка запросов. Cам DBI определяет только набор функций, переменных и соглашений. Вся непосредственная работа выполняется Database Drivers (DBD) — модулями, обеспечивающими связь с СУБД. DBI только обеспечивает стандартный интерфейс для этих драйверов.

    Полная схема архитектуры при работе DBI выглядит примерно так: Подсоединение к СУБД обеспечивается при помощи метода connect класса DBI: Например: Означает: Подсоедение к СУБД PostgreSQL, к базе данных apavel, с именем пользователя apavel и паролем. Все ошибки будут вызывать die, что удобно при отладке, а все изменения будут внесены только при подтверждении (commit) транзакций.

    Отсоединение обеспечивается при помощи метода disconnect: $dbh->disconnect();

    Механизм курсоров и подготовки запросов
    При работе с базами данных при помощи DBI используюся курсоры — специальные об’екты, обеспечивающие последовательный доступ к результатам запросов. (В простейших случаях можно обойтись и без них, я расскажу об этом дальше.)
    Пример таблицы, используемой в дальнейшем: Placeholders
    Очень часто бывает надо подготовить какой-либо запрос, а потом использовать его с разными значениями данных. DBI предлагает для механизм placeholders: В запросе на месте таких данных указываются вопросительные знаки, а сами значения передаются в метод execute() курсора. Например: Таким образом, СУБД разбирает запрос толлько один раз, а затем просто исполняет его, что экономит время. (Естественно, это верно только для DBMS с раздельными parse и execute, сейчас ни MySQL, ни PostgreSQL такое не поддерживают, поэтому их реализации DBD просто сохраняют запрос переданный $dbh->prepare() и затем подставляют в него данные при каждом $sth->execute().)

    Илон Маск рекомендует:  Что такое код alter domain
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL