Інтерфейс з perl (MySQL perl API), Perl, Програмування, статті

Олексій Паутов, up.botik.ru

Зміст


  • Попередження

  • Про автора інтерфейсу


  • Коротко про головне


    Є два способи звернення з програми на perl до бази даних MySQL. Справа в тому, що дві різні людини написали в загальному-то однаково хороші, хоча й різні бібліотеки для такого доступу. Вирішено включити в поставку обидва варіанти
    perl API.

    Наявність perl API дає величезні можливості по доступу до баз даних MySQL з скриптів на цій мові. Враховуючи, що perl дуже часто використовується в інтернеті (для написання CGI-скриптів), цей інтерфейс дозволяє створювати web-орієнтовані бази даних.

    Простий інтерфейс з perl СУБД MySQL


    Цей інтерфейс є перший спосіб звернутися до бази даних MySQL з програми на perl.

    Коротко про головне:


    use Mysql;
    $dbh = Mysql->Connect;
    $dbh = Mysql->Connect($host);
    $dbh = Mysql->Connect($host,$database);
    $dbh = Mysql->Connect($host,$database,$password);
    $dbh = Mysql->Connect($host,$database,$password,$user);
    $dbh->SelectDB($database);
    $sth = $dbh->ListFields($table);
    @arr = @{$sth->name};
    @arr = @{$sth->length};
    $value = $sth->numfields;
    @arr = @{$sth->type};
    @arr = @{$sth->is_num};
    @arr = @{$sth->is_blob};
    @arr = @{$sth->is_not_null};
    $sth = $dbh->Query($sql_statement);
    @arr = $dbh->ListDBs;
    @arr = $dbh->ListTables;
    @arr = $sth->FetchRow;
    %hash = FetchHash $sth;
    $sth->DataSeek($row_number);
    $scalar = $dbh->sock;
    $scalar = $dbh->host;
    $scalar = $dbh->database;
    $scalar = $dbh->quote($binary_string);

    Ну що, всім все ясно? Кому ще не зрозуміло, пояснюю.

    При розробці цього пакета, його намагалися зробити якомога більше схожим на 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.


    Connect


    $dbh = Mysql->Connect;
    $dbh = Mysql->Connect($host);
    $dbh = Mysql->Connect($host,$database);
    $dbh = Mysql->Connect($host,$database,$password);
    $dbh = Mysql->Connect($host,$database,$password,$user);

    Ця команда встановлює з’єднання з сервером і базою даних. Без аргументу або з нового рядка в якості першого аргументу він зв’язується з пристроєм UNIX / dev / mysql, який сильно підвищує ефективність. Ім’я бази даних у другому аргументі вказує з якою саме базою даних треба зв’язатися. Повертається дескриптор бази даних, якщо команда Connect виконана успішно. В іншому випадку повертається значення не визначено. Якщо Ви використовуєте mysqld, скомпільований з бібліотекою потоків MIT, Ви не зможете використовувати пристрої. У цьому випадку вкажіть ім’я сервера в змінної host. А взагалі бібліотека потоків MIT таке глюкан …

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

    Повертається дескриптор потрібен для звернення до бази даних. Можна віддати кілька команд Connect змінних ($ dbh1, $ dbh2, $ dbh3, …)

    З отриманого дескриптора можна витягти відомості про імені сервера, порте та імені бази даних:

    $scalar = $dbh->sock;
    $scalar = $dbh->host;
    $scalar = $dbh->database;

    Ім’я бази даних не визначено, якщо при виклику команди Connect
    було вказано тільки ім’я сервера.

    Зміна порту

    Змінити порт, до якого приєднався MysqlPerl можна так:

    $ENV{"MYSQL_TCP_PORT"}=3334;
    $ENV{"MYSQL_UNIX_PORT"}="/tmp/mysql_new.sock";
    use Mysql;
    $dbh = Mysql->Connect($host);


    SelectDB


    Вибір бази даних для використання.

    СИНТАКСИС:

    $dbh->SelectDB($database);

    ОПИС:

    Якщо база даних не обрана в команді Connect, Або якщо потрібно зв’язатися з іншою базою даних, то використовується дескриптор бази даних з попереднього виклику команди Connect. Він використовується командою
    SelectDB.


    ListFields


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

    СИНТАКСИС:

    $sth = ListFields $dbh $table;

    ОПИС:

    ListFields повертає операторний дескриптор, який може використовуватися, щоб з’ясувати, що саме сервер повинен Вам передати. У випадку помилки повертається значення не визначено.

    MySQL ListFields не працює так само як mSQL ListFields. В MySQL Ви використовуєте наступні команди, щоб отримати інформацію після виклику
    ListFields.

    Перед використанням наступних функцій, Ви повинні виконати успішне звернення до ListFields.















    @arr = @{$sth->name}; Повертає масив імен стовпців
    @arr = @{$sth->length}; Повертає масив довжин стовпців
    $value = $sth->numfields; Повертає кількість стовпців у таблиці
    @arr = @{$sth->type}; Масив MySQL типів
    @arr = @{$sth->is_num}; Масив 0 і 1, де 1 вказує що стовпець числовий
    @arr = @{$sth->is_blob}; Масив 0 і 1, де 1 вказує що стовпець – blob
    @arr = @{$sth->is_not_null}; Масив 0 і 1, де 1 вказує що стовпець – не NULL


    Query


    Виконати запит.

    СИНТАКСИС:


    ОПИС:

    Ця функція дозволяє Вам надсилати запит базі даних. Ви повинні використовувати FetchRow, щоб отримати результат.

    ПРИКЛАД:


    $sth = $dbh->Query(“SELECT * FROM Widget_Table
    WHERE widget_id = 1”) or die $Mysql::db_errstr;
    $foo = $record[0];
    $bar = $record[1];
    }

    Хороша ідея – завжди перевірити помилки. У цьому прикладі такою перевіркою займається блок “or die …” оператора Query.


    ListDBs


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

    СИНТАКСИС:


    ОПИС:

    ListDBs повертає масив, який містить один елемент для імені кожної бази даних, керованої MySQL.

    ПРИКЛАД:

     @ Dbs = $ dbh-> ListDBs; # Повертає масив імен баз даних. $ Count = $ # dbs; # Обчислює скільки елементів.
    for ($i=0;$i<=$count;$i++) {
    print(” “.$dbs[$i].”\n”);
    }


    ListTables


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

    СИНТАКСИС:

    @arr = $dbh->ListTables;

    ОПИС:

    Повертає масив з одним елементом для кожного імені таблиці в базі даних. Ви повинні були, визначити базу даних при виклику Connect або
    SelectDB.

    ПРИКЛАД:


    @tables = $dbh->ListTables; # Assumes that $dbh points
    # to a valid database
    $count = $#tables; # Figure out how many elements.
    for ($i=0;$i<=$count;$i++) { # Print out the table names.
    print(” “.$tables[$i].”\n”);
    }

    FetchCol


    Повертає масив, що містить один стовпець, що складається зі значень.

    СИНТАКСИС:

    @arr = $sth->FetchCol($col);

    ОПИС:

    Повертає масив значень для стовпця номер $ col. FetchRow повертає наступний рядок результату запиту. FetchCol повертає весь одиночний стовпець результату запиту.

    Зверніть увагу, що ця функція скине поточний покажчик рядки на кінець таблиці, і ви повинні використовувати DataSeek (0), щоб перевстановити його.

    FetchHash


    Повертає результат запиту.

    СИНТАКСИС:


    ОПИС:

    Повертає асоціативний масив, що містить наступний рядок, отриману з сервера.


    FetchRow


    Повертає рядок результатів.

    СИНТАКСИС:

    @arr = $sth->FetchRow;

    ОПИС:

    Повертає масив значень наступного рядка, отриманої з сервера.

    DataSeek


    Позиціонується на довільну позицію в даних.

    СИНТАКСИС:

    DataSeek $sth $row_number;

    ОПИС:

    Дає можливість Вам визначити зміщення в даних, пов’язане з операторним дескриптором. Наступний виклик FetchRow поверне відповідний рядок (Перший рядок має зміщення = 0).

    Обробка двійкових рядків


    Деяких символів потрібно уникнути перш, ніж двійкові рядки можуть бути вставлені в базу даних MySQL. MySQL perl API забезпечує наступну функцію, щоб робити це автоматично.

    СИНТАКСИС:

    $scaler = $dbh->quote($binary_string)

    ОПИС:

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

    Втрачені значення


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



    Метадані


    Тепер переглянемо вищезгадані методи щодо метаданих.

    Дескриптор бази даних


    Як згадано вище, Ви отримуєте дескриптор бази даних за допомогою:

    $dbh = Connect Mysql $host, $database;

    Дескриптор бази даних зберігає відомості про хост-імені сервера, його порте і імені бази даних, з якою встановлено зв’язок. Ці три значення можна отримати так:

    $scalar = $dbh->sock;
    $scalar = $dbh->host;
    $scalar = $dbh->database;

    База даних не визначена, якщо зв’язок встановлено без аргументів чи тільки з одним аргументом.


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


    Два конструктора повертають операторний дескриптор:

    $sth = ListFields $dbh $table;
    $sth = Query $dbh $sql_statement;

    $sth зберігає всі метадані, надані API:




























    $scalar = $sth->affected_rows; Скільки записів вставлено або змінена.
    $scalar = $sth->info; Статистика про попередні запити ALTER TABLE або LOAD DATA FROM INFILE.
    $arrref = $sth->is_blob; Масив бітів, що специфікує є дане поле BLOB.
    $arrref = $sth->is_not_null; Масив бітів, що специфікує є дане поле NULL.
    $arrref = $sth->is_pri_key; Масив бітів, що специфікує є дане поле первинним ключем.
    $arrref = $sth->is_num; Масив бітів, що специфікує є дане поле числом.
    $scalar = $sth->insert_id; Значення, присвоєне стовпцю за допомогою AUTO_INCREMENT останнім INSERT.
    $arrref = $sth->length; Масив довжин усіх полів в байтах.
    $arrref = $sth->name; Імена всіх стовпців.
    $scalar = $sth->numrows; Кількість повертаються записів.
    $scalar = $sth->numfields; Кількість повертаються полів.
    $arrref = $sth->table; Імена кожного стовпця в таблиці.
    $arrref = $sth->type; Тип кожного стовпця, визначений в mysql.h. Доступний за допомогою
    &Mysql::CHAR_TYPE, &Mysql::INT_TYPE, &Mysql::REAL_TYPE


    Опція-w


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

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

    Попередження


    MySQL використовує бібліотеку libmysql.a, написану Міхаелем Віденіусом (Michael Widenius). Ця бібліотека обов’язково повинна бути встановлена ​​до використання цього інтерфейсу з perl.

    Про автора інтерфейсу

    MySQL perl API заснований на mSQL perl API версії 1.17, розробленої Андреасом Коєнігом (Andreas Koenig’s
    koenig@franz.ww.TU-Berlin.DE
    ).

    Драйвер MySQL DBD Perl


    Цей драйвер є другий спосіб звернутися до бази даних MySQL з програми на perl.

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

    Огляд:



    use DBI;
    $dbh = DBI->connect( $host, $database, $user, ‘mysql’ [, $password] );
    # or
    $dbh = DBI->connect(”, ”, ”, ‘mysql’, {hostname => “localhost”,
    port => 3333, database => “test”,
    username => “myname”, password => “mypassword”,});

    ПРИКЛАД:



    #!/usr/bin/perl
    use DBI;
    $drh = DBI->install_driver(‘mysql’);
    $dbh = $drh->connect(”,’test’,”,”) or die “Error connecting to database”;
    $dbh->do(“DROP TABLE foo”);
    $dbh->do(“CREATE TABLE foo ( Field_1 VARCHAR(60) )”);
    $count = 1;
    while ($count < 500) { $sth = $dbh->prepare(“INSERT INTO foo VALUES(‘XXXYYYZZZ’)”);
    $sth->execute; $ Sth-> finish; # Дуже важливо викликати finish, інакше не звільниться пам’ять.
    print “$count\n” unless $count % 10;
    $count = $count + 1;
    }

    Коротко про головне


    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, Треба:


    $id = $dbh->func(“_InsertID”);

    Дуже великі числа


    Обмеження на роботу з дуже великим числом специфічні для мови perl взагалі, а не для будь-якого API зокрема. Так що все, що про це сказано вище, справедливо і в даному випадку.

    Вставка двійкових рядків


    У разі вставки двійкових даних в базу даних Ви повинні обійти деякі символи. Ви можете використовувати наступний метод:


    $mystring = $dbh->quote($rawstring);

    Про автора інтерфейсу


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

    Що можна почитати

    DBI (3) для інформації про використання DBD / DBI.

    домашня сторінка DBI
    www.tcx.se домашня сторінка mysql,

    www.hughes.com.au домашня сторінка msql.


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

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


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

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

    Ваш отзыв

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

    *

    *