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 架构

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

# Ubuntu sudo apt-get install mysql-client sudo apt-get install libmysqlclient15-dev # Centos yum install mysql-devel

Unter Mac OS müssen Sie die Datei ~/.bash_profile oder ~/.profile ändern und den folgenden Code hinzufügen:

MYSQL=/usr/local/mysql/bin export PATH=$PATH:$MYSQL export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

Oder verwenden Sie einen symbolischen Link:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

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:

sudo gem install dbi sudo gem install mysql sudo gem install dbd-mysql

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:

ruby extconf.rbOderruby extconf.rb --with-mysql-dir=/usr/local/mysqlOderruby extconf.rb --mit-mysql-config

Dann kompilieren:

make

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

git clone https://github.com/erikh/ruby-dbi.git

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.

ruby setup.rb config

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:

ruby setup.rb config --with=dbi,dbd_mysql

Schritt 3

Der letzte Schritt besteht darin, die Treiber zu erstellen und sie mit dem folgenden Befehl zu installieren:

ruby setup.rb setup ruby setup.rb install

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

#!/usr/bin/ruby -w require "dbi" begin #Verbindung zum MySQL-Server herstellen dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") #Serverversions-String abrufen und anzeigen row = dbh.select_one("SELECT VERSION()") puts "Serverversion: " + row[0] rescue DBI::DatabaseError => e puts "Ein Fehler ist aufgetreten" puts "Fehlercode: #{e.err}" puts "Fehlermeldung: #{e.errstr}" ensure #Verbindung zum Server trennen dbh.disconnect if dbh end

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.

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 )" );

Ebenso können Sie SQLINSERT-Anweisungen ausführen, um Datensätze zu erstellen und sie in die EMPLOYEE-Tabelle einzufügen.

Beispiel

#!/usr/bin/ruby -w require "dbi" begin #Verbindung zum MySQL-Server herstellen 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 "Datensatz wurde erstellt" dbh.commit rescue DBI::DatabaseError => e puts "Ein Fehler ist aufgetreten" puts "Fehlercode: #{e.err}" puts "Fehlermeldung: #{e.errstr}" dbh.rollback ensure #Verbindung zum Server trennen dbh.disconnect if dbh end

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

sth = dbh.prepare(statement) sth.execute ... null oder mehr SQL Operationen ... sth.finish

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

#!/usr/bin/ruby -w require "dbi" begin #Verbindung zum MySQL-Server herstellen 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 "Datensatz wurde erstellt" rescue DBI::DatabaseError => e puts "Ein Fehler ist aufgetreten" puts "Fehlercode: #{e.err}" puts "Fehlermeldung: #{e.errstr}" dbh.rollback ensure #Verbindung zum Server trennen dbh.disconnect if dbh end

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

#!/usr/bin/ruby -w require "dbi" begin #Verbindung zum MySQL-Server herstellen 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 "Vorname: %s, Nachname : %s\n", row[0], row[1] printf "Alter: %d, Geschlecht : %s\n", row[2], row[3] printf "Gehalt :%d \n\n", row[4] end sth.finish rescue DBI::DatabaseError => e puts "Ein Fehler ist aufgetreten" puts "Fehlercode: #{e.err}" puts "Fehlermeldung: #{e.errstr}" ensure #Verbindung zum Server trennen dbh.disconnect if dbh end

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

#!/usr/bin/ruby -w require "dbi" begin #Verbindung zum MySQL-Server herstellen 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 "Ein Fehler ist aufgetreten" puts "Fehlercode: #{e.err}" puts "Fehlermeldung: #{e.errstr}" dbh.rollback ensure #Verbindung zum Server trennen dbh.disconnect if dbh end

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

#!/usr/bin/ruby -w require "dbi" begin #Verbindung zum MySQL-Server herstellen 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 "Ein Fehler ist aufgetreten" puts "Fehlercode: #{e.err}" puts "Fehlermeldung: #{e.errstr}" dbh.rollback ensure #Verbindung zum Server trennen dbh.disconnect if dbh end

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

dbh['AutoCommit'] = false #Auto-Commit auf false setzen. 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 "Transaktion fehlgeschlagen" dbh.rollback end dbh['AutoCommit'] = wahr

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

dbh['AutoCommit'] = false #Auto-Commit auf false setzen 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

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.

dbh.commit

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.

dbh.rollback

Datenbankverbindung trennen

Um die Verbindung zur Datenbank zu trennen, verwenden Sie die disconnect-API.

dbh.disconnect

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:

rescue DBI::DatabaseError => e puts "Ein Fehler ist aufgetreten" puts "Fehlercode: #{e.err}" puts "Fehlermeldung: #{e.errstr}" dbh.rollback ensure #Verbindung zum Server trennen dbh.disconnect if dbh end

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:

require "dbi/trace" .............. trace(mode, destination)

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.

dbh.prepare("SHOW DATABASES") do |sth| sth.execute puts "Databases: " + sth.fetch_all.join(", ") end

Beispiel 3

dbh.executeEs kann einen Codeblock entgegennehmen, ihm das Statement-Handle übergeben und am Ende des Blocks automatisch finish aufrufen.

dbh.execute("SHOW DATABASES") do |sth| puts "Datenbanken: " + sth.fetch_all.join(", ") end

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
1dbh.func(:createdb, db_name)
Erstellt eine neue Datenbank.
2dbh.func(:dropdb, db_name)
Löscht eine Datenbank.
3dbh.func(:reload)
Führt einen Reload-Vorgang aus.
4dbh.func(:shutdown)
Fährt den Server herunter.
5dbh.func(:insert_id) => Fixnum
Gibt den aktuellsten AUTO_INCREMENT-Wert für diese Verbindung zurück.
6dbh.func(:client_info) => String
Gibt MySQL-Clientinformationen basierend auf der Version zurück.
7dbh.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.
8dbh.func(:host_info) => String
Gibt Hostinformationen zurück.
9dbh.func(:proto_info) => Fixnum
Gibt das für die Kommunikation verwendete Protokoll zurück.
10dbh.func(:server_info) => String
Gibt MySQL-Serverinformationen basierend auf der Version zurück.
11dbh.func(:stat) => Stringb>
Gibt den aktuellen Status der Datenbank zurück.
12dbh.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