Ruby Datenbankzugriff - DBI-Tutorial
Dieses Kapitel erklärt, wie Sie Ruby für den Zugriff auf Datenbanken verwenden.Ruby DBIDas Modul bietet Ruby-Skripten eine datenbankunabhängige Schnittstelle, die dem Perl-DBI-Modul ähnelt.
DBI steht für Database Independent Interface und bezeichnet die datenbankunabhängige Schnittstelle von Ruby. DBI bietet eine Abstraktionsebene zwischen Ruby-Code und der zugrunde liegenden Datenbank, sodass Sie Datenbanken einfach wechseln können. Es definiert eine Reihe von Methoden, Variablen und Spezifikationen und bietet eine konsistente Datenbankschnittstelle, die unabhängig von der Datenbank ist.
DBI kann mit Folgendem interagieren:
- ADO (ActiveX Data Objects)
- DB2
- Frontbase
- mSQL
- MySQL
- ODBC
- Oracle
- OCI8 (Oracle)
- PostgreSQL
- Proxy/Server
- SQLite
- SQLRelay
DBI-Anwendungsarchitektur
DBI ist unabhängig von jeder im Hintergrund verfügbaren Datenbank. Ob Sie Oracle, MySQL oder Informix verwenden, können Sie DBI verwenden. Das folgende Architekturdiagramm veranschaulicht dies deutlich.
Ruby DBI verwendet im Allgemeinen eine zweischichtige Architektur:
- Datenbankschnittstellen-Schicht (DBI). Diese Schicht ist unabhängig von der Datenbank und stellt eine Reihe öffentlicher Zugriffsmethoden bereit, die unabhängig vom Datenbankservertyp verwendet werden können.
- Schicht des Datenbanktreibers (DBD). Diese Schicht ist von der Datenbank abhängig; verschiedene Treiber bieten Zugriff auf verschiedene Datenbank-Engines. MySQL, PostgreSQL, InterBase, Oracle usw. verwenden jeweils unterschiedliche Treiber. Jeder Treiber ist dafür verantwortlich, Anfragen aus der DBI-Schicht zu interpretieren und diese Anfragen auf Anfragen abzubilden, die für einen bestimmten Typ von Datenbankserver geeignet sind.
Installation
Wenn Sie Ruby-Skripte schreiben möchten, um auf eine MySQL-Datenbank zuzugreifen, müssen Sie zuerst das Ruby-MySQL-Modul installieren.
Installieren des MySQL-Entwicklungspakets
Unter Mac OS müssen Sie die Datei ~/.bash_profile oder ~/.profile ändern und den folgenden Code hinzufügen:
Oder verwenden Sie einen symbolischen Link:
DBI mit RubyGems installieren (empfohlen)
RubyGems wurde etwa im November 2003 erstellt und ist seit Ruby 1.9 Teil der Ruby-Standardbibliothek. Für weitere Details kannst du hier nachsehen:Ruby RubyGems
Verwende gem, um dbi und dbd-mysql zu installieren:
Installation aus dem Quellcode (Verwende diese Methode für Ruby-Versionen vor 1.9)
Dieses Modul ist ein DBD und kann vonhttp://tmtm.org/downloads/mysql/ruby/heruntergeladen werden.
Nachdem du das neueste Paket heruntergeladen hast, entpacke es und wechsle in das Verzeichnis, führe dann die folgenden Befehle zur Installation aus:
Dann kompilieren:
Ruby/DBI beziehen und installieren
Sie können das Ruby DBI-Modul über den unten stehenden Link herunterladen und installieren:
https://github.com/erikh/ruby-dbi
Bevor Sie mit der Installation beginnen, vergewissern Sie sich, dass Sie Root-Rechte haben. Befolgen Sie nun die folgenden Schritte zur Installation:
Schritt 1
Oder laden Sie das ZIP-Paket direkt herunter und entpacken Sie es.
Schritt 2
Wechseln Sie in das Verzeichnisruby-dbi-masterund verwenden Sie im Verzeichnis das Skriptsetup.rbzur Konfiguration. Der gebräuchlichste Konfigurationsbefehl ist 'config' ohne Parameter. Dieser Befehl installiert standardmäßig alle Treiber.
Genauer gesagt können Sie die Option --with verwenden, um die spezifischen Teile aufzulisten, die Sie verwenden möchten. Wenn Sie beispielsweise nur das Haupt-DBI-Modul und den MySQL-DBD-Schicht-Treiber konfigurieren möchten, geben Sie den folgenden Befehl ein:
Schritt 3
Der letzte Schritt besteht darin, die Treiber zu erstellen und sie mit dem folgenden Befehl zu installieren:
Datenbankverbindung
Angenommen, wir verwenden eine MySQL-Datenbank, stellen Sie vor dem Verbinden mit der Datenbank sicher:
- Sie haben eine Datenbank TESTDB erstellt.
- Sie haben die Tabelle EMPLOYEE in TESTDB erstellt.
- Die Tabelle hat die Felder FIRST_NAME, LAST_NAME, AGE, SEX und INCOME.
- Legen Sie die Benutzer-ID "testuser" und das Passwort "test123" fest, um auf TESTDB zuzugreifen.
- Das Ruby-Modul DBI wurde korrekt auf Ihrem Rechner installiert.
- Sie haben das MySQL-Tutorial gelesen und verstehen die grundlegenden Operationen von MySQL.
Nachfolgend finden Sie ein Beispiel für die Verbindung zur MySQL-Datenbank "TESTDB":
Beispiel
Beim Ausführen dieses Skripts werden auf einem Linux-Rechner die folgenden Ergebnisse ausgegeben.
Server version: 5.0.45
Wenn die Verbindung mit einer Datenquelle hergestellt wird, wird ein Datenbank-Handle zurückgegeben und indbhzur späteren Verwendung gespeichert, andernfalls wirddbhauf nil gesetzt,e.errunde::errstrgeben jeweils einen Fehlercode und einen Fehlerstring zurück.
Schließlich sollten Sie vor dem Beenden dieses Programms unbedingt die Datenbankverbindung schließen und Ressourcen freigeben.
INSERT-Operation
Wenn Sie Datensätze in einer Datenbanktabelle erstellen möchten, müssen Sie die INSERT-Operation verwenden.
Sobald die Datenbankverbindung hergestellt ist, können wir uns darauf vorbereiten, diedo-Methode oderprepareundexecute zu verwenden.Methode zum Erstellen von Tabellen oder zum Erstellen von Datensätzen, die in Datenbanktabellen eingefügt werden.
Verwendung der do-Anweisung
Anweisungen, die keine Zeilen zurückgeben, können durch Aufrufen derdo-Datenbankverarbeitungsmethode ausgeführt werden. Diese Methode nimmt einen Anweisungsstring als Parameter entgegen und gibt die Anzahl der von der Anweisung betroffenen Zeilen zurück.
Ebenso können Sie SQLINSERT-Anweisungen ausführen, um Datensätze zu erstellen und sie in die EMPLOYEE-Tabelle einzufügen.
Beispiel
Verwenden vonprepareundexecute
Sie können dieprepareundexecute-Methode von DBI verwenden, um SQL-Anweisungen in Ruby-Code auszuführen.
Die Schritte zum Erstellen von Datensätzen sind wie folgt:
- Bereiten Sie eine SQL-Anweisung mit der INSERT-Anweisung vor. Dies erfolgt mit derprepareMethode.
- Führen Sie die SQL-Abfrage aus, um alle Ergebnisse aus der Datenbank auszuwählen. Dies erfolgt mit derexecuteMethode.
- Geben Sie das Statement-Handle frei. Dies erfolgt mit derfinishAPI.
- Wenn alles reibungslos verläuft, danncommitdiese Operation, andernfalls können Sierollbackdie Transaktion abschließen.
Nachfolgend finden Sie die Syntax für die Verwendung dieser beiden Methoden:
Beispiel
Diese beiden Methoden können verwendet werden, umbind-Werte an SQL-Anweisungen zu übergeben. Manchmal sind die einzugebenden Werte nicht im Voraus bekannt; in diesem Fall werden gebundene Werte verwendet. Verwenden Sie ein Fragezeichen (?), um den tatsächlichen Wert zu ersetzen, und der tatsächliche Wert wird über die execute()-API übergeben.
Das folgende Beispiel erstellt zwei Datensätze in der Tabelle EMPLOYEE:
Beispiel
Wenn Sie mehrere INSERTs verwenden, ist es viel effizienter, eine Anweisung vorzubereiten und sie dann mehrmals in einer Schleife auszuführen, als in jeder Schleifeniteration do aufzurufen.
READ-Operation
Die READ-Operation in einer Datenbank bezieht sich auf das Abrufen nützlicher Informationen aus der Datenbank.
Sobald die Datenbankverbindung hergestellt ist, können wir uns darauf vorbereiten, die Datenbank abzufragen. Wir können diedoMethode oderprepareundexecuteMethode zum Abrufen von Werten aus Datenbanktabellen verwenden.
Die Schritte zum Abrufen von Datensätzen sind wie folgt:
- Bereiten Sie die SQL-Abfrage basierend auf den erforderlichen Bedingungen vor. Dies erfolgt mit derprepareMethode.
- Führen Sie die SQL-Abfrage aus, um alle Ergebnisse aus der Datenbank auszuwählen. Dies erfolgt mit derexecuteMethode.
- Rufen Sie die Ergebnisse eins nach dem anderen ab und geben Sie diese Ergebnisse aus. Dies erfolgt mit derfetchMethode.
- Geben Sie das Statement-Handle frei. Dies erfolgt mit derfinishMethode.
Das folgende Beispiel fragt alle Datensätze mit einem Gehalt größer als 1000 aus der Tabelle EMPLOYEE ab.
Beispiel
Dies erzeugt das folgende Ergebnis:
First Name: Mac, Last Name : Mohan Age: 20, Sex : M Salary :2000 First Name: John, Last Name : Poul Age: 25, Sex : M Salary :2300
Es gibt viele andere Methoden zum Abrufen von Datensätzen aus der Datenbank. Wenn Sie interessiert sind, können SieRuby DBI-Lesevorgang prüfen。
Aktualisierungsoperation
Die UPDATE-Operation in einer beliebigen Datenbank bezieht sich auf das Aktualisieren eines oder mehrerer vorhandener Datensätze in der Datenbank. Das folgende Beispiel aktualisiert alle Datensätze mit SEX als 'M'. Hier erhöhen wir das AGE aller Männer um ein Jahr. Dies ist in drei Schritte unterteilt:
- Bereiten Sie die SQL-Abfrage basierend auf den erforderlichen Bedingungen vor. Dies erfolgt mit derprepareMethode.
- Führen Sie die SQL-Abfrage aus, um alle Ergebnisse aus der Datenbank auszuwählen. Dies erfolgt mit derexecuteMethode.
- Geben Sie das Statement-Handle frei. Dies erfolgt mit derfinishMethode.
- Wenn alles gut geht, danncommitdie Operation, andernfalls können Sierollbackdie Transaktion abschließen.
Beispiel
DELETE-Operation
Wenn Sie Datensätze aus der Datenbank löschen möchten, müssen Sie die DELETE-Operation verwenden. Das folgende Beispiel löscht alle Datensätze aus EMPLOYEE, bei denen AGE 20 überschreitet. Die Schritte für diesen Vorgang sind wie folgt:
- Bereiten Sie die SQL-Abfrage basierend auf den erforderlichen Bedingungen vor. Dies erfolgt mit derprepareMethode.
- Führen Sie die SQL-Abfrage aus, um die erforderlichen Datensätze aus der Datenbank zu löschen. Dies erfolgt unter Verwendung derexecuteMethode.
- Geben Sie das Statement-Handle frei. Dies erfolgt mit derfinishMethode.
- Wenn alles gut geht, danncommitdie Operation, andernfalls können Sierollbackdie Transaktion abschließen.
Beispiel
Transaktionen ausführen
Eine Transaktion ist ein Mechanismus, der die Konsistenz von Transaktionen sicherstellt. Eine Transaktion sollte die folgenden vier Attribute haben:
- Atomarität:Die Atomarität einer Transaktion bedeutet, dass die in der Transaktion enthaltenen Programme als logische Arbeitseinheit für die Datenbank dienen; die von ihnen durchgeführten Datenänderungsoperationen werden entweder alle ausgeführt oder überhaupt nicht ausgeführt.
- Konsistenz:Die Konsistenz einer Transaktion bedeutet, dass sich die Datenbank vor und nach der Ausführung einer Transaktion in einem konsistenten Zustand befinden muss. Wenn der Zustand der Datenbank alle Integritätsbedingungen erfüllt, ist die Datenbank konsistent.
- Isolation:Die Isolation von Transaktionen bedeutet, dass gleichzeitige Transaktionen voneinander isoliert sind, d. h., die Operationen innerhalb einer Transaktion und die bearbeiteten Daten müssen gesperrt sein und für andere Transaktionen, die versuchen, sie zu ändern, nicht sichtbar sein.
- Dauerhaftigkeit:Die Dauerhaftigkeit einer Transaktion bedeutet, dass bei einem System- oder Medienfehler garantiert wird, dass die Aktualisierungen festgeschriebener Transaktionen nicht verloren gehen. Das heißt, sobald eine Transaktion festgeschrieben ist, sollten ihre Änderungen an den Daten in der Datenbank dauerhaft sein und jedem Fehler des Datenbanksystems standhalten. Die Dauerhaftigkeit wird durch Datenbanksicherung und -wiederherstellung gewährleistet.
DBI bietet zwei Methoden zum Ausführen von Transaktionen. Eine ist diecommit- oderrollback-Methode, mit der Transaktionen festgeschrieben oder zurückgerollt werden. Die andere ist dietransaction-Methode, die zum Implementieren von Transaktionen verwendet werden kann. Als Nächstes stellen wir diese beiden einfachen Methoden zum Implementieren von Transaktionen vor:
Methode I
Die erste Methode verwendet DBI'scommit- undrollback-Methode, um eine Transaktion explizit festzuschreiben oder abzubrechen:
Beispiel
Methode II
Die zweite Methode verwendet dietransaction-Methode. Diese Methode ist relativ einfacher, weil sie einen Codeblock erfordert, der die Anweisungen enthält, aus denen die Transaktion besteht.transactionDie Methode führt den Block aus und ruft dann, je nachdem, ob der Block erfolgreich ausgeführt wird, automatisch aufcommitoderrollback:
Beispiel
COMMIT-Operation
Commit ist eine Operation, die die Datenbank so markiert, dass die Änderungen abgeschlossen sind. Nach dieser Operation sind alle Änderungen unwiderruflich.
Nachfolgend ist ein einfaches Beispiel für den Aufruf dercommit-Methode.
ROLLBACK-Operation
Wenn Sie mit einer oder mehreren Änderungen nicht zufrieden sind und diese Änderungen vollständig rückgängig machen möchten, verwenden Sie dierollback-Methode.
Nachfolgend ist ein einfaches Beispiel für den Aufruf derrollback-Methode.
Datenbankverbindung trennen
Um die Verbindung zur Datenbank zu trennen, verwenden Sie die disconnect-API.
Wenn der Benutzer die Datenbankverbindung über die disconnect-Methode schließt, macht DBI alle unvollendeten Transaktionen rückgängig. Allerdings kann Ihre Anwendung, ohne sich auf Implementierungsdetails von DBI zu verlassen, ordnungsgemäß explizit commit oder rollback aufrufen.
Fehlerbehandlung
Es gibt viele verschiedene Fehlerquellen. Zum Beispiel Syntaxfehler beim Ausführen von SQL-Anweisungen, Verbindungsfehler oder der Aufruf der fetch-Methode für ein abgebrochenes oder abgeschlossenes Statement-Handle.
Wenn eine DBI-Methode fehlschlägt, löst DBI eine Ausnahme aus. DBI-Methoden können Ausnahmen jeglichen Typs auslösen, aber die beiden wichtigsten Ausnahmeklassen sindDBI::InterfaceErrorundDBI::DatabaseError。
Ausnahmeobjekte dieser Klassen habenerr、errstrundstatedrei Attribute, die jeweils die Fehlernummer, eine beschreibende Fehlerzeichenfolge und einen Standardfehlercode darstellen. Die Attribute werden im Folgenden detailliert beschrieben:
- err:Gibt eine ganzzahlige Darstellung des aufgetretenen Fehlers zurück; wenn der DBD dies nicht unterstützt, gibt ernilzurück. Beispielsweise gibt der Oracle-DBDORA-XXXXden numerischen Teil der Fehlermeldung zurück.
- errstr:Gibt eine Zeichenfolgendarstellung des aufgetretenen Fehlers zurück.
- state:Gibt den SQLSTATE-Code des aufgetretenen Fehlers zurück. SQLSTATE ist eine fünfstellige Zeichenfolge. Die meisten DBDs unterstützen ihn nicht, daher geben sie nil zurück.
In den obigen Beispielen haben Sie den folgenden Code bereits gesehen:
Um Debugging-Informationen darüber zu erhalten, was das Skript während der Ausführung tut, können Sie Tracing aktivieren. Dazu müssen Sie zuerst das Modul dbi/trace herunterladen und dann dietraceMethode aufrufen:
Der Wert von mode kann 0 (aus), 1, 2 oder 3 sein, und der Wert von destination sollte ein IO-Objekt sein. Die Standardwerte sind 2 bzw. STDERR.
Methoden-Codeblöcke
Es gibt einige Methoden, die Handles erstellen. Diese Methoden werden mit einem Codeblock aufgerufen. Der Vorteil der Verwendung von Codeblöcken mit Methoden besteht darin, dass sie den Handle als Argument für den Block bereitstellen und der Handle automatisch aufgeräumt wird, wenn der Block endet. Die folgenden Beispiele helfen, dieses Konzept zu verstehen.
- DBI.connect :Diese Methode erstellt ein Datenbank-Handle. Es wird empfohlen, am Ende des Blocksdisconnectaufzurufen, um die Verbindung zur Datenbank zu trennen.
- dbh.prepare :Diese Methode erstellt ein Statement-Handle. Es wird empfohlen, am Ende des Blocksfinishaufzurufen. Innerhalb des Blocks müssen Sie die Methodeexecuteaufrufen, um die Anweisung auszuführen.
- dbh.execute :Diese Methode ist ähnlich wie dbh.prepare, aber bei dbh.execute müssen Sie die execute-Methode nicht innerhalb des Blocks aufrufen. Das Statement-Handle wird automatisch ausgeführt.
Beispiel 1
DBI.connectEs kann einen Codeblock entgegennehmen, das Datenbank-Handle an ihn übergeben und das Handle am Ende des Blocks automatisch trennen.
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",
"testuser", "test123") do |dbh|
Beispiel 2
dbh.prepareEs kann einen Codeblock entgegennehmen, das Statement-Handle an ihn übergeben und am Ende des Blocks automatisch finish aufrufen.
Beispiel 3
dbh.executeEs kann einen Codeblock entgegennehmen, ihm das Statement-Handle übergeben und am Ende des Blocks automatisch finish aufrufen.
DBI transactionDie Methode kann auch einen Codeblock entgegennehmen, wie bereits in den obigen Kapiteln erklärt.
Treiberspezifische Funktionen und Attribute
DBI ermöglicht Datenbanktreibern, zusätzliche datenbankspezifische Funktionen bereitzustellen, die vom Benutzer über diefunc-Methode eines beliebigen Handle-Objekts aufgerufen werden können.
Verwenden Sie die[]= or []-Methode, um treiberspezifische Attribute festzulegen oder abzurufen.
DBD::Mysql implementiert die folgenden treiberspezifischen Funktionen:
| Nein. | Funktion & Beschreibung |
|---|---|
| 1 | dbh.func(:createdb, db_name) Erstellt eine neue Datenbank. |
| 2 | dbh.func(:dropdb, db_name) Löscht eine Datenbank. |
| 3 | dbh.func(:reload) Führt einen Reload-Vorgang aus. |
| 4 | dbh.func(:shutdown) Fährt den Server herunter. |
| 5 | dbh.func(:insert_id) => Fixnum Gibt den aktuellsten AUTO_INCREMENT-Wert für diese Verbindung zurück. |
| 6 | dbh.func(:client_info) => String Gibt MySQL-Clientinformationen basierend auf der Version zurück. |
| 7 | dbh.func(:client_version) => Fixnum Gibt Clientinformationen basierend auf der Version zurück. Dies ähnelt :client_info, gibt aber einen Fixnum statt eines Strings zurück. |
| 8 | dbh.func(:host_info) => String Gibt Hostinformationen zurück. |
| 9 | dbh.func(:proto_info) => Fixnum Gibt das für die Kommunikation verwendete Protokoll zurück. |
| 10 | dbh.func(:server_info) => String Gibt MySQL-Serverinformationen basierend auf der Version zurück. |
| 11 | dbh.func(:stat) => Stringb> Gibt den aktuellen Status der Datenbank zurück. |
| 12 | dbh.func(:thread_id) => Fixnum Gibt die ID des aktuellen Threads zurück. |
#!/usr/bin/ruby
require "dbi"
begin
#Verbindung zum MySQL-Server herstellen
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 "Ein Fehler ist aufgetreten"
puts "Fehlercode: #{e.err}"
puts "Fehlermeldung: #{e.errstr}"
ensure
dbh.disconnect if dbh
end
Dies erzeugt das folgende Ergebnis:
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