English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
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.
Se desideri scrivere script Ruby per accedere al database MySQL, devi prima installare il modulo Ruby 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
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
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
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 操作。
一旦建立了数据库连接,我们就可以准备使用 do Metodo o prepare e execute 方法创建表或创建插入数据表中的记录。
不返回行的语句可通过调用 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
您可以使用 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 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
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
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 方法,可用于实现事务。接下来我们来介绍这两种简单的实现事务的方法:
第一种方法使用 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'
第二种方法使用 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'
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
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
Disconnettersi dal database
Per disconnettersi dalla connessione database, utilizzare l'API disconnect.
dbh.disconnect
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.
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.
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|
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
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.
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:
序号 | 函数 & 描述 |
---|---|
1 | dbh.func(:createdb, db_name) 创建一个新的数据库。 |
2 | dbh.func(:dropdb, db_name) 删除一个数据库。 |
3 | dbh.func(:reload) 执行重新加载操作。 |
4 | dbh.func(:shutdown) 关闭服务器。 |
5 | dbh.func(:insert_id) => Fixnum 返回该连接的最近 AUTO_INCREMENT 值。 |
6 | dbh.func(:client_info) => String 根据版本返回 MySQL 客户端信息。 |
7 | dbh.func(:client_version) => Fixnum 根据版本返回客户端信息。这与 :client_info 类似,但是它会返回一个 fixnum,而不是返回字符串。 |
8 | dbh.func(:host_info) => String 返回主机信息。 |
9 | dbh.func(:proto_info) => Fixnum 返回用于通信的协议。 |
10 | dbh.func(:server_info) => String 根据版本返回 MySQL 服务器端信息。 |
11 | dbh.func(:stat) => Stringb> 返回数据库的当前状态。 |
12 | dbh.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