English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

访问数据库 DBI 教程 Ruby

Questa sezione ti spiegherà come utilizzare Ruby per accedere ai database.Ruby DBI Il modulo fornisce un'interfaccia indipendente dal database simile al modulo DBI di Perl per script Ruby.

DBI, ovvero Database independent interface, rappresenta l'interfaccia indipendente dal database di Ruby. DBI fornisce uno strato di astrazione tra il codice Ruby e il database sottostante, permettendoti di implementare semplicemente il passaggio tra database. Definisce una serie di metodi, variabili e specifiche, fornendo un'interfaccia di database coerente indipendente dal database.

DBI può interagire con il seguente:

  • ADO (ActiveX Data Objects)

  • DB2

  • Frontbase

  • mSQL

  • MySQL

  • ODBC

  • Oracle

  • OCI8 (Oracle)

  • PostgreSQL

  • Proxy/Server

  • SQLite

  • SQLRelay

Architettura applicativa DBI

DBI è indipendente da qualsiasi database disponibile in background. Indipendentemente da quello che stai utilizzando, Oracle, MySQL, Informix, puoi utilizzare DBI. La seguente diagramma di architettura chiarisce questo punto.

L'architettura generale di Ruby DBI utilizza due livelli:

  • Strato dell'interfaccia di database (DBI). Questo strato è indipendente dal database e fornisce una serie di metodi di accesso pubblici, indipendentemente dal tipo di server di database.

  • Strato del motore di database (DBD). Questo strato è dipendente dal database e diversi驱动程序 forniscono l'accesso a diversi motori di database. MySQL, PostgreSQL, InterBase, Oracle e altri utilizzano diversi驱动程序. Ogni驱动 program è responsabile di interpretare le richieste provenienti dal livello DBI e di mappare queste richieste alle richieste appropriate per il tipo di server di database specifico.

Installa

Se desideri scrivere script Ruby per accedere al database MySQL, devi prima installare il modulo Ruby MySQL.

Installa il pacchetto di sviluppo Mysql

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

Sul sistema Mac OS è necessario modificare il file ~/.bash_profile o ~/.profile aggiungendo il seguente codice:

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

O crea un link simbolico:

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

Installa DBI utilizzando RubyGems (raccomandato)

RubyGems è stato creato circa nel novembre 2003 e è diventato parte della libreria standard di Ruby a partire dalla versione 1.9. Per ulteriori dettagli, consulta:RubyGems Ruby

Installa dbi e dbd-mysql utilizzando gem:

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

Installa utilizzando il codice sorgente (per versioni di Ruby inferiori a 1.9 utilizzare questo metodo)

Questo modulo è un DBD e può essere scaricato da: http://tmtm.org/downloads/mysql/ruby/ Scarica e installa.

Dopo aver scaricato l'ultima versione, estrai il pacchetto nel directory e esegui i seguenti comandi per l'installazione:

ruby extconf.rb
 
O
 
ruby extconf.rb --with-mysql-dir=/usr/local/mysql
 
O
 
ruby extconf.rb --with-mysql-config

Poi compila:

make

Scarica ed installa Ruby/DBI

Puoi scaricare ed installare il modulo Ruby DBI tramite i seguenti link:

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

Prima di iniziare l'installazione, assicurati di avere i permessi di root. Ora, installa seguendo i seguenti passaggi:

Passaggio 1

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

o estrai direttamente il pacchetto zip e decomprimilo.

Passaggio 2

Entra nel percorso ruby-dbi-master, usa il percorso setup.rb Lo script esegue la configurazione. Il comando di configurazione più utilizzato è config senza alcun parametro. Il comando di default configura l'installazione di tutti i driver.

ruby setup.rb config

Più specificamente, puoi utilizzare l'opzione --with per elencare le parti specifiche che desideri utilizzare. Ad esempio, se desideri configurare solo il modulo DBI principale e il livello di driver DBD MySQL, inserisci il seguente comando:

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

Passaggio 3

L'ultimo passo è creare il driver, utilizza il seguente comando per installare:

ruby setup.rb setup
ruby setup.rb install

Connessione database

Supponiamo di utilizzare il database MySQL, assicurati di avere tutto il necessario prima di connetterti al database:

  • Hai già creato un database TESTDB.

  • Hai già creato la tabella EMPLOYEE nel TESTDB.

  • La tabella contiene i campi FIRST_NAME, LAST_NAME, AGE, SEX e INCOME.

  • Imposta l'ID utente "testuser" e la password "test123" per accedere a TESTDB

  • Il modulo DBI è stato installato correttamente sul tuo computer.

  • Hai già visto il tutorial MySQL e capito le operazioni di base di MySQL.

Ecco un esempio di connessione al database MySQL "TESTDB":

在线示例

#!/usr/bin/ruby -w
 
require "dbi"
 
begin
     # 连接到 MySQL 服务器
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
                       "testuser", "test123")
     # Ottiene la stringa della versione del server e la visualizza
     row = dbh.select_one("SELECT VERSION()")
     puts "Versione del server: " + row[0]
rescue DBI::DatabaseError => e
     puts "发生了错误"
     puts "错误代码:#{e.err}"
     puts "错误信息:#{e.errstr}"
确保
     # Disconnettersi dal server
     dbh.disconnect if dbh
end

Quando si esegue questo script, verranno generati i seguenti risultati sul computer Linux.

Versione del server: 5.0.45

Se si stabilisce una connessione con il sorgente dati, viene restituito il gestore del database (Database Handle) e salvato in dbh entro per essere utilizzato in seguito, altrimenti dbh sarà impostato al valore nil,e.err e e::errstr Restituisce il codice di errore e la stringa di errore.

最后,在退出这段程序之前,请确保关闭数据库连接,释放资源。

INSERT 操作

当您想要在数据库表中创建记录时,需要用到 INSERT 操作。

一旦建立了数据库连接,我们就可以准备使用 do Metodo o prepare e execute 方法创建表或创建插入数据表中的记录。

使用 do 语句

不返回行的语句可通过调用 do 数据库处理方法。该方法带有一个语句字符串参数,并返回该语句所影响的行数。

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 )

同样地,您可以执行 SQL INSERT 语句来创建记录插入 EMPLOYEE 表中。

在线示例

#!/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 è stato creato"
     commit
rescue DBI::DatabaseError => e
     puts "发生了错误"
     puts "错误代码:#{e.err}"
     puts "错误信息:#{e.errstr}"
     dbh.rollback
确保
     # Disconnettersi dal server
     dbh.disconnect if dbh
end

usare prepare e execute

您可以使用 DBI 的 prepare e execute 方法来执行 Ruby 代码中的 SQL 语句。

创建记录的步骤如下:

  • 准备带有 INSERT 语句的 SQL 语句。这将通过使用 prepare 方法来完成。

  • Eseguire una query SQL, selezionare tutti i risultati dal database. Questo può essere fatto utilizzando execute 方法来完成。

  • 释放语句句柄。这将通过使用 finish API 来完成。

  • 如果一切进展顺利,则 Commit è un'operazione che indica che il database ha completato le modifiche, dopo questa operazione, tutte le modifiche non sono ripristinabili. 该操作,否则您可以 Di seguito è riportato un esempio di chiamata 完成交易。

下面是使用这两种方法的语法:

在线示例

sth = dbh.prepare(statement)
sth.execute
   ... zero or more SQL operations ...
sth.finish

这两种方法可用于传 bind 值给 SQL 语句。有时候被输入的值可能未事先给出,在这种情况下,则会用到绑定值。使用问号(?)代替实际值,实际值通过 execute() API 来传递。

下面的示例在 EMPLOYEE 表中创建了两个记录:

在线示例

#!/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
     commit
     puts "Record è stato creato"
rescue DBI::DatabaseError => e
     puts "发生了错误"
     puts "错误代码:#{e.err}"
     puts "错误信息:#{e.errstr}"
     dbh.rollback
确保
     # Disconnettersi dal server
     dbh.disconnect if dbh
end

Se si utilizzano più INSERT contemporaneamente, è più efficiente preparare una statement una volta e eseguirla più volte in un ciclo rispetto a chiamare do ogni volta nel ciclo.

Operazione di lettura

Operazione di lettura su qualsiasi database significa ottenere informazioni utili dal database.

Una volta stabilita la connessione al database, possiamo preparare la query per consultare il database. Possiamo utilizzare do Metodo o prepare e execute Metodo per ottenere valori da una tabella del database.

I passaggi per ottenere i record sono i seguenti:

  • 基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。

  • Eseguire una query SQL, selezionare tutti i risultati dal database. Questo può essere fatto utilizzando execute 方法来完成。

  • Ottieni i risultati uno per uno, e stampali. Questo può essere fatto utilizzando fetch 方法来完成。

  • 释放语句句柄。这将通过使用 finish 方法来完成。

Esempio seguente consulta tutti i record con lo stipendio (salary) superiore a 1000 nella tabella EMPLOYEE.

在线示例

#!/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 "发生了错误"
     puts "错误代码:#{e.err}"
     puts "错误信息:#{e.errstr}"
确保
     # Disconnettersi dal server
     dbh.disconnect if dbh
end

这将产生以下结果:

First Name: Mac, Last Name: Mohan
Age: 20, Sex: M
Salary: 2000
First Name: John, Last Name: Poul
Age: 25, Sex: M
Salary: 2300

Ci sono molte altre modalità per ottenere record dal database, se sei interessato, puoi guardare 操作读取 DBI Ruby.

Operazione di aggiornamento

Aggiornare un'operazione su qualsiasi database significa aggiornare uno o più record esistenti nel database. Esempio seguente aggiorna tutti i record con SEX 'M'. In questo caso, aumenteremo l'AGE di un anno per tutti gli uomini. Questo sarà diviso in tre passaggi:

  • 基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。

  • Eseguire una query SQL, selezionare tutti i risultati dal database. Questo può essere fatto utilizzando execute 方法来完成。

  • 释放语句句柄。这将通过使用 finish 方法来完成。

  • 如果一切进展顺利,则 Commit è un'operazione che indica che il database ha completato le modifiche, dopo questa operazione, tutte le modifiche non sono ripristinabili. 该操作,否则您可以 Di seguito è riportato un esempio di chiamata 完成交易。

在线示例

#!/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
     commit
rescue DBI::DatabaseError => e
     puts "发生了错误"
     puts "错误代码:#{e.err}"
     puts "错误信息:#{e.errstr}"
     dbh.rollback
确保
     # Disconnettersi dal server
     dbh.disconnect if dbh
end

Operazione DELETE

Quando si desidera eliminare un record dal database, è necessario utilizzare l'operazione DELETE. Esempio seguente elimina tutti i record da EMPLOYEE con l'AGE superiore a 20. I passaggi dell'operazione sono i seguenti:

  • 基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。

  • 执行 SQL 查询,从数据库中删除所需的记录。这将通过使用 execute 方法来完成。

  • 释放语句句柄。这将通过使用 finish 方法来完成。

  • 如果一切进展顺利,则 Commit è un'operazione che indica che il database ha completato le modifiche, dopo questa operazione, tutte le modifiche non sono ripristinabili. 该操作,否则您可以 Di seguito è riportato un esempio di chiamata 完成交易。

在线示例

#!/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
     commit
rescue DBI::DatabaseError => e
     puts "发生了错误"
     puts "错误代码:#{e.err}"
     puts "错误信息:#{e.errstr}"
     dbh.rollback
确保
     # Disconnettersi dal server
     dbh.disconnect if dbh
end

执行事务

事务是一种确保交易一致性的机制。事务应具有下列四种属性:

  • 原子性(Atomicity):事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。

  • 一致性(Consistency):事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。

  • 隔离性(Isolation):事务的隔离性指并发的事务是相互隔离的,即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。

  • 持久性(Durability):事务的持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,它对数据库中数据的改变应该是永久性的,耐得住任何数据库系统故障。持久性通过数据库备份和恢复来保证。

DBI 提供了两种执行事务的方法。一种是 Commit è un'operazione che indica che il database ha completato le modifiche, dopo questa operazione, tutte le modifiche non sono ripristinabili.Di seguito è riportato un esempio di chiamata 方法,用于提交或回滚事务。还有一种是 transaction 方法,可用于实现事务。接下来我们来介绍这两种简单的实现事务的方法:

方法 I

第一种方法使用 DBI 的 Commit è un'operazione che indica che il database ha completato le modifiche, dopo questa operazione, tutte le modifiche non sono ripristinabili. e Di seguito è riportato un esempio di chiamata 方法来显式地提交或取消事务:

在线示例

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'")
     commit
   rescue
     puts "transaction failed"
     dbh.rollback
   end
   WHERE FIRST_NAME = 'Zara'

方法 II

第二种方法使用 transaction 方法。这个方法相对简单些,因为它需要一个包含构成事务语句的代码块。transaction 方法执行块,然后根据块是否执行成功,自动调用 Commit è un'operazione che indica che il database ha completato le modifiche, dopo questa operazione, tutte le modifiche non sono ripristinabili.Di seguito è riportato un esempio di chiamata:

在线示例

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
   WHERE FIRST_NAME = 'Zara'

dbh['AutoCommit'] = true

Operazione COMMIT

metodo. Commit è un'operazione che indica che il database ha completato le modifiche, dopo questa operazione, tutte le modifiche non sono ripristinabili. rollback

commit

dbh.commit

operazione ROLLBACK Di seguito è riportato un esempio di chiamata Se non sei soddisfatto di alcune o alcune modifiche, e vuoi ripristinare completamente queste modifiche, utilizzare

metodo. Di seguito è riportato un esempio di chiamata rollback

dbh.rollback

Esempio semplice del metodo.

Disconnettersi dal database

Per disconnettersi dalla connessione database, utilizzare l'API disconnect.

dbh.disconnect

Se l'utente chiude la connessione database tramite il metodo disconnect, DBI annulla tutte le transazioni non completate. Tuttavia, non è necessario dipendere da dettagli di implementazione di DBI, la tua applicazione può chiamare esplicitamente commit o rollback.

Gestione degli errori

Ci sono molte fonti di errore diverse. Ad esempio, gli errori di sintassi durante l'esecuzione di una frase SQL, o la connessione fallita, o la chiamata del metodo fetch su un'istanza di frase cancellata o completata. DBI::InterfaceError e DBI::DatabaseError.

Questi oggetti Exception delle classi hanno err,errstr e state Tre attributi, che rappresentano rispettivamente il numero di errore, una stringa descrittiva dell'errore e un codice di errore standard. La descrizione dettagliata degli attributi è la seguente:

  • err:Ritorna la rappresentazione in intero dell'errore che si è verificato, se il DBD non lo supporta, viene restituito nil. Ad esempio, Oracle DBD restituisce ORA-XXXX Parte numerica del messaggio di errore.

  • errstr:Ritorna la rappresentazione in stringa dell'errore che si è verificato.

  • state:Ritorna il codice SQLSTATE dell'errore che si è verificato. SQLSTATE è una stringa di lunghezza cinque caratteri. La maggior parte dei DBD non lo supporta, quindi restituisce nil.

Nel seguente esempio ha già visto il codice seguente:

rescue DBI::DatabaseError => e
     puts "发生了错误"
     puts "错误代码:#{e.err}"
     puts "错误信息:#{e.errstr}"
     dbh.rollback
确保
     # Disconnettersi dal server
     dbh.disconnect if dbh
end

Per ottenere informazioni di debug relative al contenuto dell'esecuzione dello script, è possibile abilitare il tracciamento. Per farlo, è necessario prima scaricare il modulo dbi/trace e quindi chiamare il modello di tracciamento di controllo e il destinatario dell'output trace metodo:

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

Il valore di mode può essere 0(off), 1, 2 o 3, il valore di destination dovrebbe essere un oggetto IO. I valori predefiniti sono 2 e STDERR.

blocco di codice del metodo

ci sono alcuni metodi per creare gestori. Questi metodi chiamano il blocco di codice. Uno dei vantaggi dell'uso di un blocco di codice con un metodo è che fornisce al blocco il gestore come parametro e il gestore viene automaticamente pulito quando il blocco termina. Ecco alcuni esempi che aiutano a comprendere questo concetto.

  • DBI.connect :Questo metodo genera un gestore di database, è consigliabile chiamarlo alla fine del blocco. disconnect per chiudere il database.

  • dbh.prepare :Questo metodo genera un gestore di espressioni, è consigliabile chiamarlo alla fine del blocco. finish. All'interno del blocco, è necessario chiamare execute metodo per eseguire lo statement.

  • dbh.execute :Questo metodo è simile a dbh.prepare, ma dbh.execute non richiede di chiamare il metodo execute all'interno del blocco. Il gestore di espressioni esegue automaticamente.

Esempio 1

DBI.connect può avere un blocco di codice, passando all'interno un gestore del database e chiudendo automaticamente il gestore alla fine del blocco.

dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
                  "testuser", "test123") do |dbh|

Esempio 2

dbh.prepare può avere un blocco di codice, passando all'interno un gestore di espressioni e chiamando automaticamente finish alla fine del blocco.

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

Esempio 3

dbh.execute può avere un blocco di codice, passando all'interno un gestore di espressioni e chiamando automaticamente finish alla fine del blocco.

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

DBI transaction Il metodo può anche avere un blocco di codice, il che è stato spiegato nella sezione precedente.

funzioni e proprietà specifiche del driver

DBI fornisce funzioni aggiuntive specifiche del database al driver del database, che possono essere utilizzate dall'utente attraverso qualsiasi oggetto Handle func il metodo per chiamare.

usare []= or [] Il metodo può impostare o ottenere le proprietà specifiche del driver.

DBD::Mysql ha implementato le seguenti funzioni specifiche del driver:

序号函数 & 描述
1dbh.func(:createdb, db_name)
创建一个新的数据库。
2dbh.func(:dropdb, db_name)
删除一个数据库。
3dbh.func(:reload)
执行重新加载操作。
4dbh.func(:shutdown)
关闭服务器。
5dbh.func(:insert_id) => Fixnum
返回该连接的最近 AUTO_INCREMENT 值。
6dbh.func(:client_info) => String
根据版本返回 MySQL 客户端信息。
7dbh.func(:client_version) => Fixnum
根据版本返回客户端信息。这与 :client_info 类似,但是它会返回一个 fixnum,而不是返回字符串。
8dbh.func(:host_info) => String
返回主机信息。
9dbh.func(:proto_info) => Fixnum
返回用于通信的协议。
10dbh.func(:server_info) => String
根据版本返回 MySQL 服务器端信息。
11dbh.func(:stat) => Stringb>
返回数据库的当前状态。
12dbh.func(:thread_id) => Fixnum
返回当前线程的 ID。

在线示例

#!/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 "发生了错误"
   puts "错误代码:#{e.err}"
   puts "错误信息:#{e.errstr}"
确保
   dbh.disconnect if dbh
end

这将产生以下结果:

5.0.45
50045
本地主机通过 UNIX 套接字
10
5.0.45
150621
运行时间:384981 线程:1 问题:1101078 慢查询:4 \
打开:324 清空表:1 打开表:64 \
平均每秒查询:2.860