PostgreSQL HOWTO pl 10


PostgreSQL - Jak To Zrobić w Linux-ie: Sterownik PostgreSQL (Database Interface - DBI) dla Perl-a Następna Poprzednia Spis treści 10. Sterownik PostgreSQL (Database Interface - DBI) dla Perl-a 10.1 Perl 5 - interfejs dla PostgreSQL PERL to skrót oznaczający 'Practical Extraction and Report Language'. Perl jest dostępny w dosłownie każdym systemie operacyjnym i na każdej platformie sprzętowej świata. Możesz użyć Perl-a na Windows95/NT, Apple Macintosh iMac, wszystkich odmianach Unixa (Solaris, HPUX, AIX, Linux, Irix, SCO itd.), mainframe'ach MVS, dekstop OS/2, OS/400, Amdahl UTS i wielu innych. Perl działa NAWET na wielu mało popularnych, a nawet ogólnie nieznanych systemach operacyjnych i sprzęcie!! Nie bądź więc zaskoczony, jeśli zobaczysz perl-a działającego na bardzo rzadko używanym systemie operacyjnym. Możesz sobie wyobrazić olbrzymi rozmiar bazy użytkowników i developerów Perl-a. Interfejs PostgreSQL-Perl został włączony do dystrybucji PostgreSQL. Zobacz w katalogu src/pgsql_perl5. Email kontaktowy Pgsql_perl5: E.Mergl@bawue.de Inne źródła z - ftp://ftp.kciLink.com/pub/PostgresPerl-1.3.tar.gz Strona domowa Perl-a: http://www.perl.com/perl/index.html Samouczek Perl-a, szukaj tytułu 'Tutorial' pod: http://reference.perl.com/ FAQ Perl-a: http://www.yahoo.com/Computers_and_Internet/Programming_Languages/Perl/ Graficzny interfejs użytkownika (GUI) dla Perl-a, Perl-Qt w wersji rpm: ftp://ftp.redhat.com/pub/contrib/i386 i szukaj pliku PerlQt-1.06-1.i386.rpm Graficzny interfejs użytkownika dla Perl-a, Perl-Qt: http://www.accessone.com/~jql/perlqt.html Graficzny interfejs użytkownika dla Perl-a, Perl-XForms: ftp://ftp.redhat.com/pub/contrib/i386, szukaj pliku Xforms4Perl-0.8.4-1.i386.rpm Graficzny interfejs użytkownika dla Perl-a, Perl-Tk: ftp://ftp.redhat.com/pub/contrib/i386 Narzędzia GUI dla Perl-a: http://reference.perl.com/query.cgi?ui Interfejsy bazodanowe dla Perl-a: http://reference.perl.com/query.cgi?database Translator programów w Perl-u na "C": http://www.perl.com/CPAN-local/modules/by-module/B/ , szukaj pliku Compiler-a3.tar.gz Translator skryptów powłoki Bourne'a na Perl: http://www.perl.com/CPAN/authors/id/MERLYN/sh2perl-0.02.tar.gz Translatory z awk (a2p) i sed (s2p) są dołączane do dystrybucji PERL. Zobacz również grupy dyskusyjne poświęcone PERL-owi w hierarchii comp.lang.perl.* 10.2 Perl - interfejs bazodanowy DBI CZYM JEST DBI? Interfejs bazodanowy Perl (DBI) jest interfejsem programowania aplikacji (API - Application Programming Interface) dla języka Perl. Specyfikacja Perl DBI API definiuje zestaw funkcji, zmiennnych i konwencji udostępniających spójny interfejs bazodanowy niezależny od aktualnie używanej bazy danych. Informacje do sekcji poświęconych DBI zostały wzięte z 'DBI FAQ', którego autorem jest Alligator Descartes i są zamieszczone tu za jego zgodą. Alligator Descartes Hermetica descarte@hermetica.com Sterownik DBI dla PostgreSQL: DBD-Pg-0.89 Sciągnij plik DBD-Pg-0.89.tar.gz z adresów podanych poniżej DBD-Pg-0.89: http://www.perl.com/CPAN/modules/by-module/DBD/ Pełne Archiwum Zasobów Perl-a (Comprehensive Perl Archive Network CPAN): http://www.perl.com/CPAN Lista sterowników DBI i stron poświęconych DBI: http://www.hermetica.com/technologia/perl/DBI Informacje na temat DBI: http://www.fugue.com/dbi/ Główny serwer ftp: ftp://ftp.demon.co.uk/pub/perl/db Linki do różnych stron o DBI: http://www-ccs.cs.umass.edu/db.html Linki do różnych stron o DBI: http://www.odmg.org/odmg93/updates_dbarry.html Linki do różnych stron o DBI: http://www.jcc.com/sql_stnd.html Baza danych PostgreSQL: http://www.postgresql.org WYMAGANIA: - skompiluj, przetestuj i zainstaluj Perl 5 (przynajmniej 5.002) - skompiluj, przetestuj i zainstaluj moduł DBI (przynajmniej 0.89) - skompiluj, przetestuj i zainstaluj PostgreSQL (przynajmniej 6.2) Wsparcie techniczne dla DBI Proszę wysyłać bug-reports do: E.Mergl@bawue.de Proszę dołączyć wyniki działania poleceń perl -v, perl -V wersję PostgreSQL, wersję DBD-Pg, oraz wersję DBI w bug-report. Co to jest DBI, DBperl, Oraperl i *perl? Zacytujmy Tima Bunce, projektanta i autora DBI: "Interfejs bazodanowy Perl (DBI) jest interfejsem programowania aplikacji (API - Application Programming Interface) dla języka Perl. Specyfikacja Perl DBI API definiuje zestaw funkcji, zmiennnych i konwencji udostępniających spójny interfejs bazodanowy niezależny od aktualnie używanej bazy danych." Mówiąc prostym językiem, interfejs DBI umożliwia użytkownikom "przezroczysty" dostęp do wielu typów baz danych. Tak więc, jeśli podłączasz się do Oracle'a, Informix'a, mSQL, Sybase, czy jakiejkolwiek innej bazy danych, nie musisz znać mechanizmów działania warstwy 3GL. API zdefiniowane przez DBI będzie działać na wszystkich tych typach baz danych. Podobną korzyść osiągamy dzięki możliwości podłączenia się do dwóch różnych baz danych różnych producentów przy pomocy tego samego skryptu w perl-u. Chcę na przykład odczytać dane z bazy oraclowej i wstawić je do Informixa przy pomocy jednego programu. Warstwa DBI umożliwia szybkie wykonanie tego zadania. Starszą nazwą specyfikacji DBI jest DBperl. W chwili obecnej jest zazwyczaj używany do zaznaczenia modułów interfejsu bazodanowego perl4 takich jak oraperl, isqlperl, ingperl i innych. Te interfejsy nie mają standardu API i zazwyczaj nie są już wspierane. Oto lista modułów DBperl wraz z ich odpowiednikami DBI i informacjami dodatkowymi. Zapytania odnośnie sterowników DBI powinny być kierowane bezpośrednio na e-mailową listę dystrybucyjną dbi-users. Nazwa modułu Wymagana Baza D. Autor DBI ------------ ---------------- ----- --- Sybperl Sybase Michael Peppler DBD::Sybase <mpeppler@datamig.com> http://www.mbay.net/~mpeppler Oraperl Oracle 6 & 7 Kevin Stock DBD::Oracle <dbi-users@fugue.com> Ingperl Ingres Tim Bunce & DBD::Ingres Ted Lemon <dbi-users@fugue.com> Interperl Interbase Buzz Moschetti DBD::Interbase <buzz@bear.com> Uniperl Unify 5.0 Rick Wargo Brak <rickers@coe.drexel.edu> Pgperl Postgres Igor Metz DBD::Pg <metz@iam.unibe.ch> Btreeperl NDBM John Conover SDBM? <john@johncon.com> Ctreeperl C-Tree John Conover Brak <john@johncon.com> Cisamperl Informix C-ISAM Mathias Koerber Brak <mathias@unicorn.swi.com.sg> Duaperl X.500 Directory Eric Douglas Brak User Agent Niektóre moduły DBI mają jednakże warstwy emulacyjne DBPerl, np. DBD::Oracle jest dostarczana z warstwą emulacyjną Oraperl, która umożliwia uruchamianie skryptów oraperl bez modyfikacji. Warstwa emulacyjna tłumaczy wywołania API oraperl na wywołania DBI i wykonuje je poprzez uchwyt (switch) DBI. Oto tablica przedstawiająca informacje o warstwie emulacyjnej: Moduł Warstwa emulacyjna Stan ------ ------------------ ---- DBD::Oracle Oraperl Kompletna DBD::Informix Isqlperl W trakcie rozwijania DBD::Sybase Sybperl Działa? ( Potrzebna weryfikacja ) DBD::mSQL Msqlperl Wypuszczona eksperymentalnie z DBD::mSQL-0.61 Oddzielnym przypadkiem jest emulacja Msqlperl. Msqlperl jest sterownikiem perl5 dla baz danych mSQL, ale nie spełnia specyfikacji DBI. Zamiast niej lepiej jest używać DBD::mSQL. Msqlperl można sciągnąć z CPAN: http://www.perl.com/cgi-bin/cpan_mod?module=Msqlperl Specyfikacje DBI Istnieje kilka źródeł informacji o DBI. Specyfikacja DBI http://www.hermetica.com/technologia/perl/DBI/doc/dbispec Pod tym adresem dostępne są dwie specyfikacje: nowa DBI Draft Specification, która jest dokumentem zmieniającym się jak tylko zespół developerów wypuści stabilny interfejs, oraz stara, historyczna DBPerl DBI Specification, z której wyewoluował obecny interfejs DBI. Drugi z tych dokumentów powinien być rozważany tylko w celach analiz historycznych i nie powinien służyć ani jako podręcznik programowania ani jako źródło informacji, na które należałoby się powoływać. Jest to jednakże ciągle użyteczne źródło informacji odniesieniowych. Dokumentacja POD POD-y są fragmentami dokumentacji zaszytymi w programach perla, dokumentującymi poszczególne moduły, dostarczającymi użytecznych wiadomości dla programistów i innych osób je wykorzystujących. POD dla DBI i sterowniki zaczynają być coraz bardziej banalne, a dokumentacja dla tych modułów może być odczytywana przy pomocy niżej wymienionych poleceń. Specyfikacja DBI POD dla Specyfikacji DBI może być odczytany przy pomocy polecenia perldoc DBI Oraperl Użytkownicy warstwy emulacyjnej Oraperl wbudowanej w DBD::Oracle, mogą dowiedzieć się jak programować z wykorzystaniem interfejsu Oraperl przez wykonanie: perldoc Oraperl Spowoduje to wygenerowanie zaktualizowanej kopii oryginalnych stron man-a napisanych przez Kevina Stocka dla perl4. Oraperl API jest tam w pełni opisana i wytłumaczona. DBD::mSQL Użytkownicy modułu DBD::mSQL mogą przeczytać co nieco o wewnętrznych funkcjach i właściwościach tego sterownika przez: perldoc DBD::mSQL FAQ (Frequently Asked Questions - Często Zadawane Pytania) Odpowiedzi na często zadawane pytania również są dostępne jako dokumentacja POD. Przeczytaj je przez: perldoc DBI::FAQ Może to być sposób bardzo wygodny dla osób nie podłączonych na stałe do Internetu. Ogólnie o POD Ogólne informacje na temat sposobu pisania POD, oraz ich filozofii można przeczytać tak: perldoc perlpod Użytkownicy z zainstalowanym modułem Tk mogą być zainteresowani informacją, że istnieje czytnik POD bazujący na Tk, nazwany tkpod, który potrafi sformatować POD do wygodnej dla człowieka postaci. Drobiazgi i spostrzeżenia: Kilka drobnych wycieczek w krainę DBI odbytych przez ludzi z list dyskusyjnych DBI. http://www.hermetica.com/technologia/perl/DBI/tidbits ``DBI -- The perl5 Database Interface'' Artykuł napisany przez Alligatora Descartes i Tima Bunce na temat struktury DBI. Został opublikowany w 5 wydaniu "The Perl Journal". Jest niesamowity. Idź i kup ten magazyn. W zasadzie możesz kupić wszystkie jego wydania. Adres witryny "The Perl Journal" to: http://www.tpj.com ``DBperl'' Ten artykuł został opublikowany w Listopadzie 1996 w "Dr. Dobbs Journal" poświęconym DBperl. ``The Perl5 Database Interface'' Ta pozycja to ksiązka napisana przez Alligatora Descartes-a i opublikowana przez O'Reilly and Associates. Listy dyskusyjne Istnieją trzy listy poświęcone DBI prowadzone przez Teda Lemona. Subskrypcję można zamówić przez WWW na stronie: Listy dyskusyjne http://www.fugue.com/dbi Listy, z których można skorzystać to: dbi-announce Jest to lista przeznaczona tylko dla zawiadomień i komunikatów. Jeśli z jakiegoś powodu nie możesz się na nią zapisać przez WWW, Wyślij na adres: dbi-announce-request@fugue.com maila o treści 'subscribe' dbi-dev Ta lista jest przeznaczona dla developerów omawiających pomysły i rozwiązania dotyczące interfejsu DBI, API i mechanizmów sterowników. Tylko do użytku developerów, lub zainteresowanych grup. Jeśli z jakiegoś powodu nie możesz się na nią zapisać przez WWW, Wyślij na adres: dbi-dev-request@fugue.com maila o treści 'subscribe' dbi-users Ta lista jest główną listą dyskusyjną wykorzystywaną dla zgłaszania błędów, omawiania problemów i innych spraw. Jeśli z jakiegoś powodu nie możesz się na nią zapisać przez WWW, Wyślij na adres: dbi-users-request@fugue.com maila o treści 'subscribe' Archiwa list dyskusyjnych Archiwa amerykańskich list dyskusyjnych http://outside.organic.com/mail-archives/dbi-users/ Archiwa europejskich list dyskusyjnych http://www.rosat.mpe-garching.mpg.de/mailing-lists/PerlDB-Interest Problemy z kompilacją, lub "Test się nie powiódł" ("It fails the test") Jeśli uzyskujesz zrzuty pamięci ("core dump"), spróbuj użyć modułu Devel::CoreStack do wygenerowania historii tego, co działo się na stosie (stack trace) na podstawie zrzutu pamięci. Devel::CoreStack można znaleźć w CPAN pod adresem: http://www.perl.com/cgi-bin/cpan_mod?module=Devel::CoreStack Wyślij na listę dbi-users otrzymane dane, podaj wersję modułu, wersję perla, kod zwracający błąd (test cases), wersję systemu operacyjnego i inne stosowne informacje. Im więcej informacji podasz, tym szybciej developerzy zlokalizują błąd. Jeśli nic nie wyślesz, nie oczekuj wyników. Czy DBI jest obsługiwane na platformach Windows 95 / NT? Wersje (ports) DBI i DBD::Oracle Win32 są już standardowym elementem DBI, toteż sciągnięta z Sieci wersja wyższa niż 0.81 powinna działać. Możesz uzyskać dostęp do baz MS Access i SQL-Server z DBI przez ODBC. Z DBI-0.79 (i późniejszymi) dostarczana jest eksperymentalna "warstwa emulacyjna" dla modułu Win32::ODBC. Jest nazywana DBI::W32ODBC. Aby z niej skorzystać potrzebny jest również moduł Win32::ODBC. Win32 DBI http://www.hermetica.com/technologia/perl/DBI/win32 Win32 ODBC http://www.roth.net Czym jest DBM? I dlaczego zamiast niego używać DBI ? UNIX na początku został "pobłogosławiony" prostymi "bazami danych" opartymi na plikach, zwanymi systemem dbm. dbm pozwala przechowywać dane w plikach i szybko uzyskiwać do nich dostęp. Ma to jedna poważne wady. Blokowanie plików System dbm nie pozwalał zbyt mocno wykorzystać możliwości, jakie niesie ze sobą blokowanie plików, ani też możliwości korygowania problemów wynikających z równoległego zapisywania danych [ do bazy ]. Wymuszone struktury danych System dbm pozwala na zastosowanie tylko jednej ustalonej struktury danych: pary klucz-wartość. Wartość może być co prawda złożonym obiektem, ale klucz musi być unikatowy. Jest to duże ograniczenie funkcjonalności systemów wykorzystujących dbm. Z drugiej strony, systemy dbm spełniają wymagania użytkowników wykorzystującychproste zbiory danych i ograniczone zasoby, gdyż są szybkie, silne i szczególniedobrze przetestowane. Moduły perla umożliwiające dostęp do systemów wykorzystujących dbm są już obecnie zintegrowane w podstawowej dystrybucji Perlprzez moduł AnyDBM_File. Podsumowując, DBM jest idealnym rozwiązaniem dla baz tylko do odczytu, oraz dla małych lub prostych zbiorów danych. Jednakże dla mocniejszych i skalowalnych zbiorów danych, nie mówiąc już o mocnym transakcyjnym blokowaniu, zalecane jest stosowanie DBI. Czy < tu wstaw cechę > jest obsługiwana przez DBI? Jeśli założymy, że cecha, o którą pytasz jest niestandardową cechą specyficznądla konkretnej bazy, to odpowiedź brzmi "Nie". DBI odzwierciedla podstawowy zbiór API działający z większością zbiorów danych i nie ma żadnych cech specyficznych dla jakiejś konkretnej bazy. Oczywiście, autorzy sterowników mogą, jeśli zapragną, dołączyć wywołania funkcjispecyficznych dla jakiejś bazy przez metody func zdefiniowane w DBI API. Osoby piszące skrypty powinny brać jednak pod uwagę, że wykorzystanie funkcji udostępnionych przez metody func prawdopodobnie nie będzie przenaszalnemiędzy bazami danych. Czy mozna wykorzystać DBI do pisania skryptów CGI? Jednym słowem - tak! DBI jest bardzo użyteczne przy pisaniu skryptów CGI. W zasadzie skrypty CGI stanowią jedno z dwóch głównych zastosowań DBI. DBI umożliwia programistom CGI udostępnienie użytkownikom baz danych dostępnych przez WWW. Daje im to niesamowitą ilość uporządkowanych danych do zabawy. DBI umożliwia również upgrade serwera bazodanowego w sytuacji, gdy ruch w sieci jest zbyt duży, by stara wersja mogła sobie z nim poradzić. Wszystko może się odbyć niezauważalnie dla użytkownika, bez potrzeby modyfikowania skryptów CGI. W jaki sposób uzyskać szybsze połączenia z DBD Oracle i CGI? W celu obsłużenia żądań klientów, demon http Apache zarządza zestawem procesów potomnych httpd. Przy użyciu modułu Apache mod_perl napisanego przez Douga MacEacherna, interpreter perl-a zostaje osadzony z potomkami httpd. CGI, DBD i inne Twoje ulubione moduły mogą zostać załadowane przy starcie każdego procesu potomnego. Nie zostaną przeładowane, dopóki nie zmienią się na dysku. Jeśli chcesz uzyskać więcej informacji na temat Apache, zobacz strony Projektu Apache: Strony Projektu Apache http://www.apache.org Moduł Mod_perl http://www.perl.com/cgi-bin/cpan_mod?module=mod_perl `Kiedy uruchamiam skrypt perla z linii poleceń, działa, ale gdy zrobię to samo pod kontrolą httpd, sypie się. Dlaczego?' Zazwyczaj najczęstszą przyczyną takiego działania jest fakt, że użytkownik (z którego id uruchamiasz skrypt w linii poleceń) ma poprawnie ustawione zmienne środowiska, w przypadku DBD::Oracle są to np.$ORACLE_HOME, $ORACLE_SID lub TWO_TASK. Proces httpd zazwyczaj działa z id użytkownika nobody, co powoduje, że zmienne środowiska nie są ustawione. Żaden skrypt uruchamiany w takiej sytuacji nie ma szans na poprawne działanie. Aby rozwiązać ten problem, ustawiaj zmienne środowiska Twojej bazy w bloku BEGIN ( ) na początku skryptu. Powinno to załatwić sprawę. Powinieneś również sprawdzić logi swojego serwera httpd (na wszelki wypadek), a także ``Rozwiązywanie problemów z Perlem / CGI (dla opornych)'' (``Idiot's Guide To Solving Perl / CGI Problems'') i ``Programowanie CGI w Perlu, FAQ'' (``Perl CGI Programming FAQ''). Jest bardzo mało prawdopodobne, że błąd jest związany z DBI. Przeczytaj dokładnie OBA te dokumenty! Rozwiązywanie problemów z Perl / CGI (dla opornych) http://www.perl.com/perl/faq/index.html Czy można wykorzystać wielowątkowość w DBI? Jak na razie, nie. Perl nie udostępnia wielowątkowości. Jednakże ma być ona częścią podstawowej dystrybucji Perla w wersji 5.005. Spowoduje to, że DBI będzie zapewniała wielowątkowość wkróce potem. Kilka przykładów kodu OCI dla Oracle, który posiada wielowątkowe instrukcje SELECT, znajdziesz w: http://www.hermetica.com/technologia/oracle/oci/orathreads.tar.gz 'W jaki sposób mogę wywoływać w DBI procedury przechowywane (stored procedure)?' Zakładając, że stworzyłeś procedurę przechowywaną w docelowym systemie, np. w bazie Oracle, możesz użyć $dbh->do aby od razu ją wywołać. Na przykład: $dbh->do( "BEGIN MojaProcedura END" ); Jak mogę w DBI pobrać wartości zwracane przez procedurę przechowywaną? Pamiętaj o obsłudze błędów! $sth = $dbh->prepare( "BEGIN foo(:1, :2, :3); END;" ); $sth->bind_param(1, $a); $sth->bind_param_inout(2, \$path, 2000); $sth->bind_param_inout(3, \$success, 2000); $sth->execute; W jaki sposób mogę w DBI utworzyć lub skasować bazę danych? Tworzenie i usuwanie bazy danych to pojęcia zbyt abstrakcyjne, aby były obsługiwane przez DBI. Na przykład Oracle w ogóle nie obsługuje idei kasowania bazy danych! Również w Oracle'u serwer bazy danych w zasadzie jest bazą danych, podczas gdy w mSQL serwer może spokojnie działać bez stworzonej na nim bazy. Problemy te są zbyt nieporównywalne, aby je próbować rozwiązać. Niektóre sterowniki mimo to obsługują tworzenie i kasowanie bazy prywatnymi metodami func (private func method). Powinieneś sprawdzić dokumentację sterowników, których używasz, aby dowiedzieć się czy obsługują ten mechanizm. W jaki sposób DBI obsługuje wartości NULL? Standard DBI opisuje NULLe jako wartości niezdefiniowane (undef). Wartości NULL ogą być wstawiane do bazy jako NULL, na przykład: $rv = $dbh->do( "INSERT INTO table VALUES( NULL )" ); ale kiedy są zwracane przez zapytanie, muszą być testowane jako undef. To jest standard dla wszystkich sterowników. Czym są te metody func? Metody func zostały zdefiniowane w DBI jako punkt wejściowy do wykorzystywania specyficznych możliwości konkretnej bazy danych, np. umożliwienia tworzenia lub kasowania baz danych. Wywoływanie tych specyficznych dla danego sterownika funkcji jest proste, na przykład, aby wywołać jednoargumentową metodę createDatabase, napisalibyśmy: $rv = $dbh->func( 'argument', 'createDatabase' ); Powinniśmy jednak pamiętać, że metody func nie są przenaszalne między bazami danych. Komercyjne wsparcie i szkolenie Interfejs bazodanowy Perl5 jest oprogramowaniem darmowym. Przychodzi BEZ JAKIEJKOLWIEK GWARANCJI. Jednakże są organizacje udostępniające zarówno wsparcie techniczne, jak i szkolenia programowania DBI. PERL CLINIC : Perl Clinic może udostępnić komercyjne wsparcie Perla, DBI, DBD::Oracle oraz Oraperl. Wsparcie jest udostępniane przez firmę, w której pracuje Tim Bunce, autor DBI. Więcej informacji znajdziesz na ich stronach: http://www.perl.co.uk/tpc Następna Poprzednia Spis treści

Wyszukiwarka