Najlepszy samouczek Ruby dostępu do bazy danych - DBI Tutorial W 2024 r. W tym samouczku możesz dowiedzieć się DBI architektury aplikacji,zainstalować,Database Connectivity,operacja INSERT,Zastosowanie do instrukcja,Korzystanieprzygotowanieiwykonanie,operacji odczytu,aktualizacja Operacja,operacja usuwania,sprawy wykonawcze,metoda I,Sposób II,COMMIT operację,operacja ROLLBACK,Odłącz bazę danych,błąd przetwarzania,metoda blok,Funkcje i właściwości specyficznych dla kierowcy,Przykłady,
Ten rozdział pokaże jak korzystać z Ruby, aby uzyskać dostęp do bazy danych. ModułRuby DBIzapewnia interfejs bazy danych niezależnych jest podobny do modułu Perl DBI skryptów Ruby.
DBI czyli Database niezależny interfejs, w imieniu interfejsu bazy niezależne Ruby. DBI między kodu Ruby z podstawowej bazy danych zapewnia warstwę abstrakcji, która pozwala na łatwe wdrożenie przełączenie bazy danych. To definiuje zestaw metod, zmiennych i norm, zapewnia spójny interfejs DATABASE niezależne.
DBI mogą wchodzić w interakcje z następującymi zasadami:
DBI niezależne od jakiegokolwiek dostępnego w tle bazy. Czy używasz Oracle, MySQL, Informix, można użyć DBI. Poniższy wykres wyraźnie ilustruje ten punkt.
Ruby DBI ogólna architektura korzysta z dwóch warstw:
Jeśli chcesz pisać skrypty Ruby dostępu do bazy danych MySQL, trzeba zainstalować moduł Ruby MySQL.
# Ubuntu sudo apt-get install mysql-client sudo apt-get install libmysqlclient15-dev # Centos yum install mysql-devel
Mac OS, trzeba zmodyfikować ~ / .bash_profile lub plik ~ / .profile, dodaj następujący kod:
MYSQL=/usr/local/mysql/bin export PATH=$PATH:$MYSQL export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Albo użyć miękkiego połączenia:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
RubyGems o założona w listopadzie 2003 roku, stała się częścią biblioteki standardowej Ruby z Ruby 1.9 wersji. Więcej szczegółów można obejrzeć: Ruby RubyGems
Użyj gem install dBi i DBD-mysql:
sudo gem install dbi sudo gem install mysql sudo gem install dbd-mysql
Moduł jest DBD z http://tmtm.org/downloads/mysql/ruby/~~HEAD=pobj pobrania.
Po pobraniu najnowszy pakiet, rozpakować do katalogu, należy wykonać następujące polecenie, aby zainstalować:
% ruby extconf.rb 或者 % ruby extconf.rb --with-mysql-dir=/usr/local/mysql 或者 % ruby extconf.rb --with-mysql-config
Następnie kompilacji:
% make
Uzyskać i zainstalować Ruby / DBI
Można pobrać i zainstalować moduł Ruby DBI z poniższego linku:
https://github.com/erikh/ruby-dbi |
Przed rozpoczęciem instalacji, upewnij się, że masz uprawnienia administratora. Teraz należy zainstalować następujące kroki, aby zainstalować:
Etap 1
git clone https://github.com/erikh/ruby-dbi.git
Lub bezpośrednio pod innym zip i rozpakować.
Etap 2
Podaj katalogruby-dBi-master,użyjsetup.rbskrypt konfiguracyjny w katalogu. Najczęstsze polecenia konfiguracyjne nie są przestrzegane dowolnymi parametrami parametrem konfiguracyjnym. Komenda domyślna konfiguracja, aby zainstalować wszystkie sterowniki.
$ ruby setup.rb config
Dokładniej, można użyć opcji --with do listy konkretną partię, którą chcesz użyć. Na przykład, jeśli chcesz skonfigurować główny moduł DBI i napęd warstwy MySQL DBD, wprowadź następujące polecenie:
$ ruby setup.rb config --with=dbi,dbd_mysql
etap 3,
Ostatnim krokiem jest utworzenie dysku, należy użyć następującego polecenia, aby zainstalować:
$ ruby setup.rb setup $ ruby setup.rb install
Załóżmy, że mamy do korzystania z bazy danych MySQL przed połączeniem się z bazą danych, należy upewnić się, że:
Poniżej przedstawiono przykłady baz danych MySQL związku "testdb" stanowi:
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") # 获取服务器版本字符串,并显示 row = dbh.select_one("SELECT VERSION()") puts "Server version: " + row[0] rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Po uruchomieniu tego skryptu, przyniesie następujące rezultaty na komputerze z systemem Linux.
Server version: 5.0.45
Jeśli nawiązanie połączenia ze źródłem danych, zwróconym uchwyt bazy danych (uchwyt bazy danych), a zapisywane wpierśnicy do późniejszego wykorzystania lub dbhzostanie ustawiony nawartość zerową,e.err ie :: errstrzwróci kod błędu i błąd ciąg.
Wreszcie, przed zamknięciem tego programu, należy zamknąć połączenie z bazą danych, uwolnienie zasobów.
Gdy chcesz utworzyć rekord w tabeli bazy danych, należy użyć operacji INSERT.
Raz do połączenia z bazą danych, jesteśmy gotowi, aby utworzyć tabelę lub wstawić dane w tabeli, aby utworzyć metodę nagrywania przy użyciuzrobić lub przygotowaćiwykonaćmetodami.
Oświadczenie nie zwraca wierszezrobić poprzez wywołanie metody przetwarzania baz danych.Metoda ta przyjmuje parametr ciąg oświadczenie i zwraca liczbę wierszy dotkniętych instrukcji.
dbh.do("DROP TABLE IF EXISTS EMPLOYEE") dbh.do("CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )" );
W podobny sposób możnawykonaćinstrukcjiINSERT,aby utworzyć rekordy do tabeli pracownika.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)" ) puts "Record has been created" dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Można użyć metodyprzygotowaniairealizacjiDBI do wykonania Ruby oświadczenia kod SQL.
Aby utworzyć płytę, co następuje:
Oto składnia tych dwóch metod:
sth = dbh.prepare(statement) sth.execute pl. zero or more SQL operations pl. sth.finish
Obie metody mogą być stosowane dowiązania wartości przejść SQL.Czasami wartości do wprowadzenia nie mogą zostać podane przed, w tym przypadku, stosuje się do wiązania wartości. Używaj znaku zapytania(?) Zamiast rzeczywistej wartości, wartość rzeczywista przejść przez execute () API.
Poniższy przykład tworzy dwa rekordy w tabeli Pracownik:
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (?, ?, ?, ?, ?)" ) sth.execute('John', 'Poul', 25, 'M', 2300) sth.execute('Zara', 'Ali', 17, 'F', 1000) sth.finish dbh.commit puts "Record has been created" rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Jeśli korzystasz z wielu INSERT, to najpierw przygotować sprawozdanie, a następnie wykonać kilka razy w pętli przez każdego cyklu, niż wymaga zrobić o wiele bardziej efektywnie.
Operacja odczytu na dowolnej bazy danych odnosi się do uzyskania użytecznych informacji z bazy danych.
Raz do połączenia z bazą danych, jesteśmy gotowi do zapytania do bazy danych. Możemy zastosować metodę lubsposób przygotowaniaiwykonaniametody, aby uzyskać wartości z tabeli bazy danych.
Pierwsze krok rejestrowane w następujący sposób:
W poniższym przykładzie kwerendy wszystkich płac (wynagrodzenia) rejestrowane ponad 1000 od stołu pracownika.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("SELECT * FROM EMPLOYEE WHERE INCOME > ?") sth.execute(1000) sth.fetch do |row| printf "First Name: %s, Last Name : %s\n", row[0], row[1] printf "Age: %d, Sex : %s\n", row[2], row[3] printf "Salary :%d \n\n", row[4] end sth.finish rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure # 断开与服务器的连接 dbh.disconnect if dbh end
To daje następujące wyniki:
First Name: Mac, Last Name : Mohan Age: 20, Sex : M Salary :2000 First Name: John, Last Name : Poul Age: 25, Sex : M Salary :2300
Każde działanie w bazie UPDATE odnosi się do jednej lub więcej aktualizacji bazy istniejących rekordów. Poniższy przykład aktualizuje seks jest "M" dla wszystkich rekordów. Tutaj dodamy roku wszystkie mężczyźni wiekowych. Będzie można podzielić na trzy etapy:
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ?") sth.execute('M') sth.finish dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Jeśli chcesz usunąć rekordy z bazy danych, należy użyć operacji usuwania. Poniższe przykłady usuwać wieku 20 lat w stosunku do wszystkich zapisów od pracownika. Etapy działania są następujące:
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("DELETE FROM EMPLOYEE WHERE AGE > ?") sth.execute(20) sth.finish dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Transakcja jest mechanizmem, w celu zapewnienia spójności transakcyjnej. Usługi powinny mieć cztery następujące atrybuty:
DBI oferuje dwa sposoby na wykonanie transakcji. Jednym z nich jestzobowiązanialubwycofaniametody popełnienia lub wycofać transakcję. Istnieje również sposóbtransakcjamoże być wykorzystywane do realizacji transakcji. Następnie wprowadzić dwie proste metody realizacji transakcji:
Pierwsza metoda wykorzystujezatwierdzanieiROLLBACKmetod DBI jawnie popełnienia lub anulować transakcję:
dbh['AutoCommit'] = false # 设置自动提交为 false. begin dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'") dbh.commit rescue puts "transaction failed" dbh.rollback end dbh['AutoCommit'] = true
Druga metoda wykorzystuje metodętransakcji.Metoda ta jest stosunkowo prosta, ponieważ wymaga transakcja stanowi blok kodu zawierający oświadczenie. Metodatransakcjiwykonuje blok, a następnie blok jest wykonana pomyślnie, automatycznie wywołaćpopełnienialubwycofać:
dbh['AutoCommit'] = false # 设置自动提交为 false dbh.transaction do |dbh| dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'") end dbh['AutoCommit'] = true
Zobowiązać się operacja została zakończona w celu identyfikacji zmian w bazie danych, a po tej operacji, wszystkie zmiany nie podlegają zwrotowi.
Oto prosty przykładzobowiązać wywołania metody.
dbh.commit
Jeśli nie jesteś zadowolony z jednego lub kilku zmian, chcesz, aby całkowicie przywrócić te zmiany, należy użyć metodywycofywania.
Oto prosty przykładwycofania wywołania metody.
dbh.rollback
Aby rozłączyć się z bazą danych, należy użyć API rozłączania.
dbh.disconnect
Jeśli użytkownik zamyka metodę rozłączania połączenia z bazą danych, DBI wycofuje wszystkie niekompletne transakcji. Jednak to nie opiera się na szczegółach realizacji którejkolwiek DBI, a aplikacja może być dobrym wyraźne wezwanie do popełnienia lub wycofać.
Istnieje wiele różnych źródeł błędów. Na przykład błędy składniowe w celu wykonania instrukcji SQL lub połączenie nie powiedzie się, czy jest kompletne zestawienie połączenia lub anulowanego uchwyt sprowadzić metodę.
Jeśli metoda DBI zawiedzie, DBI rzuci wyjątek. Metoda DBI mogą rzucić dowolny typ wyjątku, ale dwa najważniejsze klasy Wyjątkiem jestDBI :: InterfaceErroriDBI :: Databaseerror.
obiekty wyjątkiem tych klas sąErr,errstr trzy atrybuty istan,sub-tabela przedstawia liczbę błędów, opisową błędzie ciąg i standardowy kod błędu. Parametry określone w następujący sposób:
W powyższym przykładzie, widziałeś następujący kod:
rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Aby uzyskać informacje debugowania o treści skryptu jest wykonywany, gdy skrypt zostanie wykonany, można włączyć śledzenie. Aby to zrobić, należy najpierw pobrać moduł dBi / śledzenia, a następnie zadzwonić do śledzenia tryb sterowania i sposobu wyjścia przeznaczeniaśledzenia:
require "dbi/trace" plplplplplplpl trace(mode, destination)
Tryb wartość może być 0 (wyłączone), 1,2 lub 3, wartość przeznaczenia powinno być przedmiotem IO. Domyślne wartości to 2 i stderr.
Istnieją sposoby, aby utworzyć uchwytu. Metody te są wywoływane przez blok kodu. Zalety korzystania z bloków kodu za pomocą metody jest to, że dostarczają one uchwyt do bloku jako argument, gdy blok zostaje rozwiązana automatycznie usuwane uchwyt. Oto kilka przykładów, które pomogą zrozumieć tę koncepcję.
DBI.connect może blok kodu, przekazując mu uchwytu bazy danych, a uchwyt automatycznie odłączać na końcu bloku.
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") do |dbh|
dbh.prepare może blok kodu, przechodząc uchwyt wyciągu oraz wywołuje automatycznie zakończyć na końcu bloku.
dbh.prepare("SHOW DATABASES") do |sth| sth.execute puts "Databases: " + sth.fetch_all.join(", ") end
dbh.execute może blok kodu, przechodząc uchwyt wyciągu oraz wywołuje automatycznie zakończyć na końcu bloku.
dbh.execute("SHOW DATABASES") do |sth| puts "Databases: " + sth.fetch_all.join(", ") end
Sposób transakcjiDBImoże być również wyposażona w bloku kodu, co w powyższych sekcjach nie wyjaśniono powyżej.
Niech sterownik bazy danych DBI zapewnia dodatkowe funkcje konkretnej bazy danych, funkcje te mogą być wywoływane przez jakąkolwiekfunkłatwy sposób Handle obiektu.
Użyj[] = lub [],aby ustawić metodę lub uzyskać atrybuty specyficzne sterowniki.
DBD :: mysql realizuje następujące funkcje określonego sterownika:
Nie. | Funkcja i opis |
---|---|
1 | dbh.func (: createdb, db_name) Utwórz nową bazę danych. |
2 | dbh.func (: dropdb, db_name) Aby usunąć bazę danych. |
3 | dbh.func (: reload) Odśwież operację. |
4 | dbh.func (: shutdown) Wyłącz serwer. |
5 | dbh.func (: insert_id) => Fixnum Zwraca ostatnią wartość AUTO_INCREMENT połączenia. |
6 | dbh.func (: client_info) => String Zwraca MySQL wersja klienta informacje wymagane. |
7 | dbh.func (: client_version) => Fixnum W zależności od informacji o wersji z powrotem do klienta. To jest: Podobny do client_info, ale powróci do Fixnum, zamiast wracać ciąg. |
8 | dbh.func (: host_info) => String Zwraca informacje hosta. |
9 | dbh.func (: proto_info) => Fixnum Zwraca protokołów wykorzystywanych do komunikacji. |
10 | dbh.func (: server_info) => String Zwraca informacje o wersji serwera MySQL w oparciu. |
11 | dbh.func (: stat) => Stringb > Zwraca aktualny stan danych. |
12 | dbh.func (: thread_id) => Fixnum Zwraca id bieżącego wątku. |
#!/usr/bin/ruby require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") puts dbh.func(:client_info) puts dbh.func(:client_version) puts dbh.func(:host_info) puts dbh.func(:proto_info) puts dbh.func(:server_info) puts dbh.func(:thread_id) puts dbh.func(:stat) rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure dbh.disconnect if dbh end
To daje następujące wyniki:
5.0.45 50045 Localhost via UNIX socket 10 5.0.45 150621 Uptime: 384981 Threads: 1 Questions: 1101078 Slow queries: 4 \ Opens: 324 Flush tables: 1 Open tables: 64 \ Queries per second avg: 2.860