Введення в MySQL (використовуючи Perl DBI), Статті, Perl, статті

Я вважаю, що якщо назва статті не звучить для Вас чуже, то, можливо, Ви в потрібному місці.

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

Чому ж MySQL, а ні інша база даних SQL?

Хоча б тому, що вона безкоштовна, швидка і має хорошу підтримку.

Дані організовуються як ряди і колонки, що утворюють матрицю. З точки зору SQL, матриця називається таблицею.

Кращий спосіб для C програміста зрозуміти що ж це таке:

Кожен ряд – це структурна посилання.

Кожна колонка – це член цієї структури.

Ось звичайна структура (клас, оголошений з ключовим словом struct) в C:

struct users
{
int id;
char nickname[17];
char password[17];
int socks;
int favorite_number;
};

Це виглядає як інформація, зібрана Web-сайтом користувача.


А от MySQL версія цієї структури:

create table users
(
id int auto_increment not null,
nickname varchar(16) not null,
password varchar(16) not null,
socks int,
favorite_number int,
primary key (user_id),
unique (nickname)
);

Кілька схоже, чи не так?


Ось як буде виглядати ряд в MySQL:

+—-+———-+———-+——-+—————–+
| id | nickname | password | socks | favorite_number |
+—-+———-+———-+——-+—————–+

Що ж тоді матриця? Ось дані в таблиці (матриці) про трьох гіпотетичних користувачів:

+—-+———-+———-+——-+—————–+
| 1 | GdayMate | dingo | 57 | 42 |
+—-+———-+———-+——-+—————–+
| 2 | Javier | cigar | 1 | 945 |
+—-+———-+———-+——-+—————–+
| 3 | Rolo | pudding | 9 | 8 |
+—-+———-+———-+——-+—————–+

Фактично ці таблиці – це те, що ви побачите, якщо введете в MySQL наступну команду:

select * from users;

Зірочка означає, що ми вибираємо все колонки з таблиці.


Таблиця – Це структурна основа багатомільярдної річний індустрії баз даних, яка включає в себе такі компанії, як Oracle і
Informix.


Найпростіші команди MySQL


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

create table users
(
id int auto_increment not null,
nickname varchar(16) not null,
password varchar(16) not null,
socks int,
favorite_number int,
primary key (user_id),
unique (nickname)
);

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

select nickname, favorite_number from users;

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

+———-+—————–+
| nickname | favorite_number |
+———-+—————–+
| GdayMate | 42 |
+———-+—————–+
| Javier | 945 |
+———-+—————–+
| Rolo | 8 |
+———-+—————–+

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

select nickname from users where socks < 10 and favorite_number > 100;
+———-+
| nickname |
+———-+
| Javier |
+———-+

Як же ввести дані в таблицю? Це просто.

insert into users (nickname, socks) values (“Cowlick”, 0);

Так, але ми забули додати поле пароля в таблицю!

create table users
(

password varchar(16) not null,

);

Під NOT NULL розуміється те, що поле
має нести в собі будь-які дані. Тому в заданому вище прикладі MySQL видасть помилку. Тому слід зробити так:

insert into users (nickname, password, socks) values (“Cowlick”, “udder”, 0);

Результат буде таким:

+—-+———-+———-+——-+—————–+
| id | nickname | password | socks | favorite_number |
+—-+———-+———-+——-+—————–+
| 4 | Cowlick | udder | 0 | NULL |
+—-+———-+———-+——-+—————–+

Але зачекайте! Ми не визначили id! Воно також not null.

create table users
(
id int auto_increment not null,

);

В цьому випадку колонку id ми визначили як auto_increment і MySQL сама створює значення для нас, Додаючи 1 до найбільшого значення, яке знайде в таблиці (Rolo має id == 3).


Ми забули ввести улюблене число користувача Cowlick. Яке, між іншим, -1. Для цього ми будемо використовувати команду update.

update users set favorite_number = -1 where id = 4;

Також можемо виконати це таким чином:

update users set favorite_number = -1 where nickname = “Cowlick”;

Але раптом у нас з’явиться більше ніж один користувач з прізвиськом Cowlick? У нашому прикладі цього бути не може, тому що в командіcreate table ми визначили:

create tables users
(

unique (nickname)
);

Якщо ми спробуємо ввести ще одного користувача з прізвиськом Cowlick, То ми отримаємо помилку від MySQL.


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

delete from users where nickname = “Javier”;

Якщо ж Ви хочете видалити всю таблицю, то необхідно буде зробити наступне.

drop table users;

Визначення таблиці і всі дані після вищеописаної команди будуть видалені. Будьте обережні з цією командою.


Типи MySQL і primary key


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

create table users
(

primary key (user_id),

)

Створюється первинний ключ. Первинний ключ – це особливий ключ, який може бути тільки один для даної таблиці для кожної аблиц. По суті, первинний ключ – це унікальний (UNIQUE) ключ з ім’ям “PRIMARY”. Незважаючи на привілейованих статус, він функціонує як інший унікальний ключ. Але


select * from users where user_id = 2;


швидше, ніж


select * from users where favorite_number = 945;


MySQL обмежений маленькими типами даних? Якщо, звичайно, Ви вважаєте, що
4 гігабайти – Це мало, то так. Це розмір, який може бути поміщений в поля типів LongBlob і LongText.


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

create table messages
(
id int auto_increment not null,
user_id int not null,
posting_date datetime not null,
comment_body text
primary key (id)
)

Цей приклад надав нам два нових типи: datetime і text.


Дані колонки datetime структурувати наступним чином: “YYYY-MM-DD hh:mm:ss”. У даному прикладі поdatetime можуть бути розсортовані повідомлення. Для нас це всього лише рядок.


Типtextможе містити дані до 64Kb, що більш ніж достатньо для повідомлення.




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



Ось приклад ряду (message_body може бути
більше довгим):

+—-+———+———————+————–+
| id | user_id | posting_date | message_body |
+—-+———+———————+————–+
| 1 | 3 | 2000-10-10 10:00:00 | Wassup! |
+—-+———+———————+————–+

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

create table message_votes
(
message_id int not null,
user_id int not null,
vote enum(“good”, “bad”) not null,
primary key (message_id, user_id)
);

У цьому прикладі колонка vote може містити одне з двох: або “good”, Або”bad”.


Для пошуку голосування повідомлення можна буде зробити наступне:

select * from message_votes where message_id = 3;

, Що буде швидше, ніж:

select * from message_votes where user_id = 2;

Але найшвидшим пошуком голосування за повідомленням буде:

select * from message_votes where message_id = 3 and user_id = 2;

Тепер ми готові до взаємодії DBI і MySQL.


Використання Perl DBI як інтерфейс для MySQL


Чому PERL? Чому не PHP? -Як, але вважається, що PHP4 достатньо швидкий за рахунок нового інтерпретатора?


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


Давайте почнемо з з’єднання з базою даних:

use DBI;
my $dsn = “DBI:mysql:my_database:localhost”;
my $db_user_name = “admin”;
my $db_password = “secret”;
my ($id, $password);
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);

Давайте припустимо, що ми отримали з форми логін і пароль користувача. Отже,

$ Input_nickname = “Cowlick” і $ input_password = “udder”

Природно наше бажання перевірити чи дійсно введений пароль відповідає введеному логіну в нашій БД.

my $sth = $dbh->prepare(qq{select id, password
from users
where nickname = $input_nickname});
$sth->execute();

Зазначу відсутність крапки з комою. При одній команді вона не обов’язкове.


Як же ми отримаємо результат? Т.к. ми очікуємо лише один ряд те,

($id, $password) = $sth->fetchrow_array(); $ Sth-> finish (): # закінчили запрос if ($ input_password eq $ password) # чутливо до регістру
{ … # Вхід вдалий
}

Що ж робити якщо результат – більше одного рядка? Тривалі запити до

$sth->fetchrow_array()

повернуть нам частину даних.

my $sth = $dbh->prepare(qq{
select nickname, favorite_number from users
});
$sth->execute();
while (my ($nickname, $favorite_number) = sth-> fetchrow_array ()) # робити вибірку даних # Поки нічого не залишиться
{
print "$nickname, $favorite_number
";
}
$sth->finish();

Якщо ж ми хочемо зберегти всі результати для подальшого використання

my (@matrix) = ();
while (my @ary = $sth->fetchrow_array())
{ push (@ matrix, [@ ary]); # [@ ary] це посилання
}
$sth->finish();

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


Ви можете дістати ряд $i за допомогою:

@{matrix[$i]}

Або, дістати потрібний ряд і колонку ($i, $j) В таблиці:

$matrix[$i][$j]

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

$dbh->do("insert into message_votes
(message_id, user_id, vote) values (1, 3, “good”)");

І, нарешті, щоб закінчити роботу з базою – роз’єднання:

$dbh->disconnect();

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*