Mysql и perl взаимовыгодное сотрудничество


Содержание

Mysql и perl: взаимовыгодное сотрудничество

Для связи с нами можно использовать:
irc://irc.chatnet.ru:#gfs
icq://546460
email://cobalt[@]gfs-team.ru

Элитный клуб общения с самыми красивыми девушками
pastila.com

© Cobalt 20.05.2006 статья не оптимизирована

© Cobalt 20.05.2006 статья не оптимизирована

А как можно выполнить SQL запросы каторые храняться в файлах?

потратил полчаса чтобы понять что указанный в теме :
$db = Mysql->Connect($host,$database,$password,$user);
неверно
верно:
$db = Mysql->Connect($host,$database,$user,$password);

Как импортировать большую базу данных в mysql

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

2Mb. Если это случается на виртуале, то обычно просто заливаю базу через ftp и прошу суппорт хостинга помочь в данном вопросе.

Поскольку использую нормальные хостинги, то решение это проблемы занимает всего 10-15 минут, так что особо не парился, но тут столкнулся с тем что возникла необходимость подсказать человеку у которого суппорт курил бамбук, так что выделилось несколько вариантов решения данной проблемы. Оговорюсь сразу что наиболее удобен для импорта базы данных mysql последний вариант, но он подходит только тем у кого есть доступ к терминалу. Так что в статье описаны все возможные способы импорта большой базы данных в mysql, кроме общения с суппортом.

1. Варинт первый – выгружаем бэкап базы не целиком, а по несколько таблиц, чтобы файл не превышал наши лимиты. Основной минус данного решения- это то, что операцию выгрузки- загрузки необходимо будет проводить много раз, так что подойдет исключительно для тех у кого много свободного времени и нечем заняться на досуге.

2. Вариант второй – выгружать в пожатом состоянии- так как степень сжатия для текстового файла будет максимальной. Но тут опять же можно столкнуться с тем, что на хостинге не установлена поддержка архиваторов.

3. Используем сторонний скрипт, который позволяет производить экспорт и импорт базы данных, минуя общение с phpMyAdmin. Наиболее известный из имеющихся в наличии, и к тому же наиболее хорошо работающий- это BigDump. О том как его настроить – я отписался чуть позже, так что это касается и настройки по 5му пункту.

4. Как частный случай 3 вариант, возможно залить на сервер эмулятор терминала и сделать 5 пункт через него. Например можно попробовать PHPterm, но в этом варианте можно столкнуться с ограничениями хостинга в плане безопасности запуска команд и скриптов.

5. Также есть простенькая программка аналогичная BigDump, которая также позволяет импортировать большие базы данных, только в данном случае необходим Zend Optimizer либо Nu-Coder. Программка называется Sypex Dumper, и вторую версию скрипта можно даже интегрировать в наиболее популярные CMS. На сайте есть как платная утилита, так и облегченная бесплатная версия.

6. Если таки имеется доступ к консоли, то можно добавить в php.ini следующие строки (увеличиваем лимит загрузки файлов по времени и размеру), после загрузки, лучше вернуть все назад, чтобы не нагнули сервак с оказией:
max_execution_time = 20000
max_input_time = 20000
upload_max_filesize = 150M
post_max_size = 150M

7. Но на самом деле наиболее быстрым и оптимальным вариантом загрузки большой базы данных, имея доступ к консоли, будет загрузить дамп базы данных dump.sql через ftp, а затем залить её через консоль ssh:
mysql -h hostname -u user-name -p DB_name dump.sql.utf8
либо указать необходимую кодировку при процедуре импорта базы данных:
mysql -h hostname -u user-name -default_character_set utf8 -p DB_name младше 4.1.1. В старших версиях она активирована по умолчанию.

Опции —quick и —opt рекомендуется использовать, если база данных MySQL слишком большая для того, чтобы целиком поместиться в памяти.

При этом утилита mysqldump выдает ошибку:

В итоге строчка для создания копии базы данных получается следующей:

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

Если во время импорта вы получите ошибку вида

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

Как правило, такое случается, если базу данных MySQL используют для хранения содержимого различных файлов, например, картинок или музыки, не размещая их непосредственно в файловой системе. В таком случае, если размер какого-нибудь файла превышает определённое значение — база данных становится непригодной для использования на наших серверах и потребуется либо удалить такие данные из вашей базы, либо рассмотреть вариант использования сервера баз данных на VPS-сервере , где можно установить нужное ограничение max_allowed_packet в необходимое значение, либо не использовать его вообще.

Если на вашем сервере установлена версия MySQL 4.0.x, то для корректного переноса данных со сторонних серверов необходимо при экспорте базы данных использовать ключ:

Как работать с MySQL из скриптов на Perl

Для работы с MySQL из Perl-скриптов как правило используют модуль DBI. Это позволяет удобно открывать и закрывать соединения к СУБД, подготавливать и выполнять запросы к базе, обрабатывать ошибки и так далее. Если вы не имеете опыта работы с MySQL из Perl, рекомендуем вам книгу «Программирование на Perl DBI» (рус., англ.).

Итак, пример работы с MySQL из Perl DBI:

В этом примере мы сначала определяем переменные с параметрами доступа к MySQL, далее выдаем HTTP-заголовок, так как это у нас скрипт для запуска через веб, затем соединяемся с базой, подготавливаем и отправляем select-запрос, получаем и печатаем результаты, после чего закрываем соединение. Это простейший скрипт для работы с MySQL из Perl. Более подробные примеры вы можете найти в этой статье.

Как работать с MySQL из скриптов на PHP

Для работы с MySQL вы можете использовать встроенный в язык PHP средства, поддержка которых уже осуществляется на хостинге. PHP имеет развитый и понятный интерфейс к этой СУБД, что делает работу с MySQL именно из PHP наиболее простой и удобной особенно для начинающих веб-мастеров и веб-программистов.

Полная документация на русском языке по работе с MySQL из PHP-скриптов находится здесь. Кроме описаний, там же вы найдете советы опытных пользователей и примеры использования функций, упоминаемых в документации. Также рекомендуем вам статью «Использование MySQL в PHP сценариях» на сервере hostinfo.ru.

Загрузка данных с помощью LOAD DATA

Начиная с версии MySQL 3.23.49, LOAD DATA LOCAL по умолчанию запрещено по соображениям безопасности, и его надо специально включать.

MySQL-сервер у нас работает с включенным LOAD DATA LOCAL, но необходимо включение данной функциональности со стороны клиента.

Для утилиты mysql есть несколько вариантов включения данной опции:

  1. Параметр —local-infile=1
  2. Создать в домашней директории файл .my.cnf и в нем разрешить эту опцию для группы [mysql], которой пользуется данная утилита:

Включение данного режима из perl’а: необходимо в dsn при подключении указать файл конфигурации mysql (т.к. библиотека libmysql по умолчанию никаких дополнительных файлов конфигурации не читает) и группу в нем, в файле создать эту группу, и для этой группы выставить local-infile=1:

Например, вписываем в

а в скрипте подключение оформляем так:

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


В функции mysql_connect() необходимо использовать аргумент 128 (значение константы CLIENT_LOCAL_FILES) в качестве пятого параметра.

Дополнительные MySQL-база и MySQL-доступ (MySQL-пользователь)

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

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

Вот еще немного инфы (которая, кстати работает, сам проверял)

Импорт больших файлов sql в базу данных mysql

Как изменить максимально допустимый размер импорта файла sql в базе данных Mysql.

Для этого нужен доступ к папке \usr\local\mysql-5.1\ на сервере (или на локальном сервере denver).

По умолчанию у вас установлен Максимально допустимый размер загружаемого файла 2 MB .

По этому пути \usr\local\mysql-5.1\ открываем файл конфигурации my.cnf.

Раскомментируйте следующие строки, если вы хотите изменить
настройки InnoDB по умолчанию.
#
#innodb_data_home_dir = /usr/local/mysql-5.1/var/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /usr/local/mysql-5.1/var/
#innodb_log_arch_dir = /usr/local/mysql-5.1/var/
# Вы можете установить .._buffer_pool_size размером до 50 — 80 %
# оперативной памяти, но опасайтесь перерасхода
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M — здесь меняем до нужного размера!
#Устанавливайте .._log_file_size to 25 % от _buffer_pool_size
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout = 50

Затем перезагружаем сервер и весело работаем с импортом больших sql файлов.

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 .

Илон Маск рекомендует:  Подсветка XML-кода

Как и в любом модуле 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 показывает, как вывести все сведения о некоторой таблице.

Введение в MySQL (используя Perl DBI)

MySQL — это реляционная база данных. MySQL основана на технологии client/server. Все примеры команд MySQL в этой статье могут быть введены прямо в командную строку MySQL. MySQL поддерживает многострочные команды и использует точку с запятой, как разделитель между командами.

Почему же MySQL, а ни другая база данных SQL?

Хотя бы потому, что она бесплатна, быстра и имеет хорошую поддержку.

Данные организуются как ряды и колонки, образующие матрицу. С точки зрения SQL, матрица называется таблицей.

Лучший способ для C программиста понять что же это такое:

Каждый ряд — это структурная ссылка.

Каждая колонка — это член этой структуры.

Вот обычная структура (класс, объявленный с ключевым словом struct) в C:

Это выглядит как информация, собранная Web-сайтом о пользователе.

А вот MySQL версия этой структуры:

Несколько похоже, не так ли?

Вот как будет выглядеть ряд в MySQL:

Что же тогда матрица? Вот данные в таблице(матрице) о трёх гипотетических пользователях:

Фактически эти таблицы — это то, что вы увидете, если введёте в MySQL следующую команду:


select * from users;

Звёздочка означает, что мы выбираем все колонки из таблицы.

Таблица — это структурная основа многомиллиардной годовой индустрии баз данных, которая включает в себя такие компании, как Oracle и Informix.

Простейшие команды MySQL

Давайте быстро «пробежим» по простейшим командам MySQL. Вы уже занете команду create.

А что же делать, если хотим увидеть только прозвища и любимые числа пользователей?

Данная команда даст нам:

А если хотим вывести прозвища пользователей, но с условием, что носков у них меньше, чем 10 пар и их любимое число больше, чем 100?

Как же ввести данные в таблицу? Это просто.

Да , но мы забыли добавить поле пароля в таблицу!

Под NOT NULL понимается то, что поле должно нести в себе какие-либо данные. Поэтому в заданном выше примере MySQL выдаст ошибку. Поэтому следует сделать так:

Результат будет следующим:

Но подождите! Мы не определили id! Оно также not null.

В этом случае колонку >

Мы забыли ввести любимое число пользователя Cowlick. Которое, между прочим, -1. Для этого мы будем использовать команду update.

Также можем выполнить это следующим образом:

Но вдруг у нас появится больше чем один пользователь с прозвищем Cowlick? В нашем примере этого быть не может, т.к. в командеcreate table мы определили:

Если мы попробуем ввести ещё одного пользователя с прозвищем Cowlick, то мы получим ошибку от MySQL.

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

Если же Вы хотите удалить всю таблицу, то необходимо будет сделать следующее.

Определение таблицы и все данные после вышеописанной команды будут удалены. Будьте осторожны с этой командой.

Типы MySQL и primary key

Мы не говорили о директиве primary key в команде create table.

Создаётся первичный ключ. Первичный ключ — это особый ключ, который может быть только один для данной таблицы для каждой аблицы. По сути, первичный ключ — это уникальный (UNIQUE) ключ с именем «PRIMARY». Несмотря на привелегированный статус, он функционирует как другой уникальный ключ. Но

MySQL ограничен маленькими типами данных? Если, конечно, Вы считаете, что 4 гигабайта — это мало, то да. Это размер, который может быть помещён в поля типов LongBlob и LongText.

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

Этот пример предоставил нам два новых типа: datetime и text.

Данные колонки datetime структуированы следующим образом: «YYYY-MM-DD hh:mm:ss». В данном примере поdatetime могут быть отсортированы сообщения. Для нас это всего лишь строка.

Типtextможет содержать данные до 64Kb, что более чем достаточно для сообщения.

Колонка user_id является реляционной частью Реляционной Системы Управления Базой Данных (РСУБД).

Вот пример ряда (message_body может быть более длинным):

Предположим мы имеем систему голосования, где пользователи могут оценить действительно ли сообщение было достойно чтения или нет. Создадим таблицу, подобную этой:

В этом примере колонка vote может содержать одно из двух: либо ‘good’, либо ‘bad’.

Для поиска голосования сообщения можно будет сделать следующее:

, что будет быстрее, чем:

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

Теперь мы готовы к взаимодействию DBI и MySQL.

Использование Perl DBI как интерфейс для MySQL

Почему PERL? Почему не PHP? Как-никак, но считается, что PHP4 достаточно быстр за счёт нового интерпретатора?

Я отвечу, потому, что Perl — это язык, который наиболее часто сейчас используется. А я люблю идти в ногу со стандартами индустрии. Perl имеет большую поддержку online и большинство книг написано о нём. Существует CPAN, the Comprehensive Perl Archive Network, где Вы можете найти модули для исполнения Ваших самых сокровенных желаний, относительно программирования, конечно :-). DBI даёт Вам интерфейс, который будет работать как с самой примитивной БД, так и с самой последней версией Oracle РСУБД.

Давайте начнём с соединения с базой данных:

Давайте предположим, что мы получили из формы логин и пароль пользователя. Итак,

Естественно наше желание проверить действительно ли введёный пароль соответствует введёному логину в нашей БД.


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

Как же мы получим результат? Т.к. мы ожидаем всего один ряд то,

Что же делать если результат — более одной строки? Продолжающиеся запросы к

Если же мы хотим сохранить все результаты для последующего использования

Ссылка для программистов на C может быть расценена как указатель. Матрица теперь является массивом массивов ссылок или же двумерным массивов ссылок.

Вы можете достать ряд $i при помощи:

Или, достать нужный ряд и колонку ($i, $j) в таблице:

Для операций MySQL, которые не возвращают результатов можно использовать метод do вместо prepare для того, чтобы выполнить SQL-команду.

И, наконец, чтобы окончить работу с базой — рассоединение:

Записки *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

    Perl и CGI программы — особенности использования

    1. Использование готовых скриптов

    Если у вас уже есть написанные CGI-скрипты, то прежде чем скопировать их на сервер, вы должны сделать следующие действия:

    • Убедиться, что в скриптах указан правильный путь к интерпретатору:

    Perl: /usr/bin/perl
    Python : /usr/local/bin/python

    • Если вашему скрипту требуется доступ к базе данных MySQL , то необходимо указать параметры доступа (см. статью Подключение к серверу MySQL)
    • В разделе Управление веб-серверомпанели управления хостингом включить модуль CGI.

    Теперь вы можете скопировать свои скрипты на сервер.
    Загружать файлы необходимо в каталог ваш_домен/cgi. Файлы из данного каталога будут доступны по адресу http://ваш_домен/cgi-bin/имя_файла. Для того чтобы CGI-скрипты запускались из корневого каталога сайта ваш_домен/docs, необходимо создать в нем файл .htaccess со следующим содержимым:

    На скрипты необходимо установить права доступа 755 или -rwxr-xr-x.
    Права доступа можно изменить с помощью файлового менеджера панели управления.

    2. Написание простейшего CGI-скрипта

    Рассмотрим написание простого CGI скрипта на Perl.
    Если вы работаете под управлением ОС «Windows», то для работы с кодом скриптов вам необходимо использовать специализированный текстовый редактор, например, Notepad++. Стандартную для Windows программу «Блокнот» лучше не использовать. Для демонстрации работы CGI скрипта необходимо создать два файла. Первый файл представляет собой html-документ с формой ввода текста:

    HTML PUBLIC «-//W3C//DTD HTML 4.0//EN»>

    Пример работы с Perl

    Оптимизация запросов MySQL

    Главная → MySQL → Оптимизация запросов MySQL

    MySQL располагает большим набором функций для различных сортировок (ORDER BY), группировок (GROUP BY), объединений (LEFT JOIN или RIGHT JOIN) и так далее. Все они безусловно удобны, но в условиях одноразовых запросов. К примеру, если лично Вам требуется что-то откопать в базе используя кучу таблиц и связок, то кроме вышеперечисленных функций можно и даже нужно применять условный операторы IF. Главная ошибка начинающих программистов это стремление применить такие запросы в рабочем коде сайта. В данном случае сложный запрос безусловно красив, но вреден. Все дело в том, что любые операторы сортировок, группировок, объединений или вложенных запросов, не могут выполняться в оперативной памяти, и используют жесткий диск для создания временных таблиц. А хард, как известно — самое узкое место сервера.

    Правила оптимизации mysql запросов

    1. Избегайте вложенных запросов

    Это самая серьезная ошибка. Родительский процесс всегда будет ждать завершения дочернего и в это время держать коннект к базе, использовать диск и нагружать iowait. Два параллельных запроса в базу и выполнения нужных фильтраций в серверном интерпретаторе (Perl, PHP и т. д.), выполнятся на порядок быстрее чем вложенный.

    Примеры на perl, как делать не следует:

    или не в коем случае вот так:

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

    Пример на perl, как делаю обычно я:

    2. Не сортируйте, не группируйте и не фильтруйте в базе

    По возможности не применяйте в своих запросах операторы ORDER BY, GROUP BY, JOIN. Все они используют временные таблицы. Если сортировка или группировка необходима только для вывода элементов, например по алфавиту, лучше выполнить эти действия в переменных интерпретатора.

    Примеры на perl, как сортировать не следует:

    Пример на perl, как сортирую обычно я:

    Так намного быстрее. Особенно заметна разница если данных много. В случае, если нужно отсортировать в perl по нескольким полям, можно применить сортировку Шварца. Если требуется произвольная сортировка ORDER BY RAND() — используйте сортировку random в perl.

    3. Используйте индексы

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


    Где 255 — длина ключа. Для некоторых типов данных он не требуется. Подробности в документации к MySQL.

    Библиотека Интернет Индустрии I2R.ru

    Малобюджетные сайты.

    Продвижение веб-сайта.

    Контент и авторское право.

    MySQL с высоты птичьего полета

    Для работы с MySQL, воспользуемся одним из возможных средств — DBI (Data Base Interface). Для этого подключим его к нашей программе.

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

    Теперь у нас есть дескриптор $dbh с помощью которого, мы можем обращаться к нашей БД. Как правило, он используется для SQL запросов.

    SQL (Structured Query Language — Язык Структурированных Запросов) — используется для запросов к БД. Конечно слово «Язык» звучит гордо, но дочитав эту статью до конца, вы поймете, что SQL — это очень простой язык и запросы на нем похожи на обычные предложения на английском языке.

    Итак. Для того что бы сделать запрос к БД, используется метод prepare(). Например:

    Данным запросом, мы просим БД, выдать нам имена всех работников жалование которых превышает 500 у.е. Таблица с работниками может выглядеть так:

    ID NAME SALARY
    1 Pupkin 16
    2 Ivanov 600
    3 Petrov 502

    Называется она, конечно же, WORKERS.

    После того, как мы сделали запрос, мы получаем дескриптор запроса $sth из которого можем извлечь любую интересующую нас информацию. Заметьте, что при присвоении дескриптору нового значения, информация о предыдущем запросе теряется. Т.е. если вам нужно сделать запрос и сохранить только что полученную информацию. Используйте в качестве нового дескриптора $sth2 и т.д.

    Для того что бы извлечь информацию из дескриптора запроса, как правило используется следующая конструкция:

    За каждый такт цикла while, происходит считывание одной записи из возвращенных MySQL. При этом каждый элемент массива — это одно поле считанной записи. Обычно количество полей можно предсказать при формировании запроса, но если это все таки не возможно (некоторые универсальные скрипты) используйте переменную $#row в ней хранится индекс последнего элемента массива.

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

    а так же использовать следующую конструкцию:

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

    Иногда возникает необходимость как-то отсортировать данные. Для этого используется конструкция ORDER BY. Например:

    Сортировать по имени. Хочу заметить, что далеко не на всех серверах работает сортировка русских символов. Дело в том, что на самом деле компьютеру алфавит не известен и сортирует он по кодам соответствующих символов и если в кодировке Win1251 коды символов имеют порядок, то в кодировке KOI (преимущественно используемой на Linux серверах) порядок не наблюдается.

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

    Помимо функции чтения из БД, бывают очень полезны функции удаления (delete) и изменения (update) и добавления (insert) записи. Рассмотрим их более подробно.

    Функция insert предназначена для вставки в БД записи. Например так:

    В скобках через запятую перечислены значения каждого поля. В данном случае, нам так же необходимо знать порядок полей. Самая распространенная ошибка с функцией insert — это не соответствие типов. Литерные значения и даты, всегда должны указываться в скобках. Очень часто запись имеет уникальный ID (как правило он хранится в первом поле). БД берет на себя заботу о том, что бы ID действительно оказался уникальным, поэтому нам достаточно указать на его месте 0, а система сама вычислит и подставит туда нужное значение.

    Функция delete предназначена для удаления записи или записей. Как правило, используется с некоторым условием, поскольку без условия происходит удаление всех записей, а это довольно редкое желание со стороны программиста. Пример:

    Данный запрос удаляет из базы запись поле NAME у которой равно «Vasily A. Pupkin». Если таких записей будет несколько, они все будут удалены. Именно поэтому лучше производить удаление по ID если точно не известно может ли быть еще одна запись с подобным значением.

    Условия могут быть более сложными. Для этого используются слова OR и AND. Удаляем всех Пупкиных и тех у кого жалование меньше 10 у.е.

    Функция update изменяет запись или записи в зависимости от условия. Например:

    В данном примере, мы повысили Пупкину жалование.

    Обращаться с функцией update нужно аккуратно, поскольку если не указать условие, будут изменены все (!) записи. Например:

    У всех одинаковая зарплата — 120 у.е.

    В настоящее время большинство хостинг-провайдеров предоставляют всевозможные веб-интерфейсы для формирования и работы с БД. Именно по этой причине, в статье совсем не рассматривался вопрос создания БД «вручную». Однако автор не считает веб-интерфейсы лучшим способом работы с БД и поэтому в следующей статье будут рассмотрены приемы работы с БД MySQL «в ручную».

    Perl и CGI программы — особенности использования

    1. Использование готовых скриптов

    Если у вас уже есть написанные CGI-скрипты, то прежде чем скопировать их на сервер, вы должны сделать следующие действия:

    • Убедиться, что в скриптах указан правильный путь к интерпретатору:

    Perl: /usr/bin/perl
    Python : /usr/local/bin/python

    • Если вашему скрипту требуется доступ к базе данных MySQL , то необходимо указать параметры доступа (см. статью Подключение к серверу MySQL)
    • В разделе Управление веб-серверомпанели управления хостингом включить модуль CGI.

    Теперь вы можете скопировать свои скрипты на сервер.
    Загружать файлы необходимо в каталог ваш_домен/cgi. Файлы из данного каталога будут доступны по адресу http://ваш_домен/cgi-bin/имя_файла. Для того чтобы CGI-скрипты запускались из корневого каталога сайта ваш_домен/docs, необходимо создать в нем файл .htaccess со следующим содержимым:

    На скрипты необходимо установить права доступа 755 или -rwxr-xr-x.
    Права доступа можно изменить с помощью файлового менеджера панели управления.

    2. Написание простейшего CGI-скрипта

    Рассмотрим написание простого CGI скрипта на Perl.
    Если вы работаете под управлением ОС «Windows», то для работы с кодом скриптов вам необходимо использовать специализированный текстовый редактор, например, Notepad++. Стандартную для Windows программу «Блокнот» лучше не использовать. Для демонстрации работы CGI скрипта необходимо создать два файла. Первый файл представляет собой html-документ с формой ввода текста:

    HTML PUBLIC «-//W3C//DTD HTML 4.0//EN»>

    Пример работы с Perl

    Илон Маск рекомендует:  Watcom cc faq
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL