Работа с MySql
В последнее время весьма популярной базой данных стала MySql.
Это неудивительно - небольшой, весьма и весьма шустрый, бесплатный сервер баз данных.
Не лишенный, правда, недостатоков, среди которых основной (на мой взгляд) - отсутствие поддержки вложенных запросов.
Но его скорострельность и бесплатность, по-видимому, сыграли решающую роль в выборе многих веб-мастеров использовать
именно MySql в своих разработках.
Если я не ошибаюсь, то язык Perl занимает главенствующее положение в области Web-приложений. Основная
масса CGI - скриптов и разнообразных информационных/управляющих систем на Web интерфейсе в данное время написано именно на Perl.
Для этого языка накоплен огромный мировой опыт программирования, нашедший свое воплощение в библиотеке CPAN.
Уже написана масса библиотек для всех случаев жизни (как вам например, bioperl - "A library of tools and modules of particular interest to biologists."?), и зачастую,
вместо "изобретения велосипеда" нужно просто просмотреть список готовых библиотек Perl, наверняка, что-то уже написано по
поводу решаемой вами проблемы. В данном случае, мы рассматривая взаимодействие языка Perl с сервером баз данных
MySql, будем использовать библиотоеку DBD::mysql.
Для использования библиотеки DBD необходимо наличие библиотеки DBI, поэтому они должны быть установлены на
компьютере, где используется скрипт. Кроме того, необходимо наличие сервера MySql где-нибудь поблизости от вас для
тестовых работ.
Итак, В первую очередь, вы должны договориться с сисадмином сервера предоставить вам доступ к
MySql с возможностью создавать базу или хотя бы таблицы в базе. После этого, можно протестировать подключение к MySql серверу:
#!/usr/bin/perl
use DBI;
my $dbh = DBI->connect("DBI:mysql:database=ваша_база_данных;host=адрес_сервера_mysql",
"логин", "пароль") || die $DBI::errstr;
@tables = $dbh->func( '_ListTables' );
foreach $line(@tables) {
print $line,"\n";
}
$dbh->disconnect();
При этом, если все нормально, вы на выходе этого скрипта должны ничего получить что-то типа:
таблица1
таблица2
таблица3
Где таблица1 - наименование таблиц в вашей базе данных.
Если соединение создать
не получилось, тогда что-то неправильно, или не тот хост, пароль, логин или нет такой базы - например, если нет базы данных, то будет что-то типа:
Unknown database 'ваша_база_данных' at try.pl line N.
Если нет доступа пользователю под "логин" или неправильные логин или пароль, то будет выдано сообщение
Access denied for user: 'логин@ваш_хост.домен' (Using password: YES) at try.pl line N.
Адрес сервера может быт как каноническим вида dbserver.domain.com (если корректно работет DNS) или абсолютным IP адресом.
Итак, если удалось успешно законнектится, то вы получите список таблиц в вашей БД. Если нет - проверьте логин/пароль,
поругайтесь с сисадмином, чтобы он вам разрешил доступ с вашей машины к серверу MySql. (Только на сисадмина сильно
не наезжайте - может что-то плохое сделать вам, сам знаю, сам сисадмин:)).
Теперь попробуем создать таблицу в вашей базе данных. Определимся сразу - мы сделаем небольшой каталог ссылок на ваши любимые ресурсы.
Создадим таблицу, гордо именуемую "links".
В таблице будут следующие поля:
Наименование |
Тип |
Длина |
Комментарий |
id |
TINYINT |
4 |
Идентификатор, должен быть автоинкремент |
name |
VARCHAR |
64 |
Нимаенование ссылки |
url |
VARCHAR |
128 |
Ссылка - URL |
category |
TINYINT |
4 |
Номер категории |
Когда со структурой таблицы понятно, изготовим SQL запрос для ее создания:
CREATE TABLE links (
id TINYINT, name VARCHAR(64), url VARCHAR(128), category TINYINT
}
В Perl его надо исполнять следующим образом:
#!/usr/bin/perl
use DBI;
my $dbh = DBI->connect("DBI:mysql:database=ваша_база_данных;host=адрес_сервера_mysql",
"логин", "пароль") || die $DBI::errstr;
$dbh->do("CREATE TABLE links (id TINYINT, name VARCHAR(64), url VARCHAR(128), category TINYINT)");
$dbh->disconnect();
Вот таков код для создания таблицы в базе данных.
Метод указателя базы данных do готовит и исполняет одиночную инструкцию SQL. Возвращает количество выбранных строк или undef в случае ошибки. Если возврат = -1, то
количество строк неизвестно или отсутствует. В нашем случае количество строк неактуально, поэтому мы опустили оператор присваивания.
Этот метод эквивалентен следующему набору кода:
sub do {
my($dbh, $statement, $attr, @bind_values) = @_;
my $sth = $dbh->prepare($statement, $attr) or return undef;
$sth->execute(@bind_values) or return undef;
my $rows = $sth->rows;
($rows == 0) ? "0E0" : $rows;
}
Как описано в таблице 1, поле id должно быть autoincrement.
Теперь возникают некоторые замечания:
- поле AUTO_INCREMENT должно быть ключевым (первичный индекс) - key;
- индекс key не может создаваться по полю, которое может принимать значение null;
Значит нам нужно сначала поменять свойства поля id таким образом, чтобы поле не могло принимать значения null, было ключевым индексом, и было автоинкрементальным. https://i-know.online/course-authors
вот код для этого, три SQL выражения, исполняемые методом do:
...
$dbh->do("ALTER TABLE links CHANGE id id TINYINT (4) not null");
$dbh->do("ALTER TABLE links ADD PRIMARY KEY(id)");
$dbh->do("ALTER TABLE links CHANGE id id TINYINT (4) not null AUTO_INCREMENT");
...
SQL инструкция ALTER TABLE позволяет изменять свойства таблицы. Более подробно смотри Документацию по MySql
Теперь таблица links соответствует нашим требованиям. При добавлении новой записи знаяение поля id в оной автоматически будет увеличиваться на 1.
Далее надо создать табличку категорий.
Ее структура:
Наименование |
Тип |
Длина |
Комментарий |
id |
TINYINT |
4 |
Идентификатор категории - автоинкремент |
name |
VARCHAR |
64 |
Наименование категории |
На сей раз мы создадим таблицу со всеми необходимыми нам атрибутами полей, - поле id будет ключевым, автоинкрементом.
вот SQL запрос на ее создание:
CREATE TABLE category (id TINYINT not null AUTO_INCREMENT, name VARCHAR (64) not null , PRIMARY KEY (id))
Исполняем его уже известным нам методом do :
$dbh->do("CREATE TABLE category (id TINYINT not null AUTO_INCREMENT, name VARCHAR (64) not null , PRIMARY KEY (id))");
Теперь нужно в наши таблицы внести данные. Об этом в следующей статье
|