Latest web development tutorials

Rubí acceso a la base de datos - Tutorial DBI

Este capítulo le mostrará cómo utilizar Rubí para acceder a la base de datos. módulo deRubí DBIproporciona una interfaz de base de datos independiente es similar al módulo de Perl DBI para los scripts de Ruby.

DBI es decir, base de datos de la interfaz independiente, en nombre de la interfaz de base de datos independiente de Ruby. DBI entre el código Ruby con la base de datos subyacente proporciona una capa de abstracción que le permite implementar fácilmente un cambio de conexión de base de datos. Se define un conjunto de métodos, variables y normas, proporciona una interfaz de base de datos consistente base de datos independiente.

DBI puede interactuar con los siguientes:

  • ADO (ActiveX Data Objects)
  • DB2
  • Frontbase
  • mSQL
  • MySQL
  • ODBC
  • oráculo
  • Oci8 (Oracle)
  • PostgreSQL
  • Proxy / Servidor
  • SQLite
  • SQLRelay

arquitectura de la aplicación de DBI

DBI independiente de cualquier base de datos disponible en el fondo. Ya sea que esté usando Oracle, MySQL, Informix, puede utilizar el DBI. La siguiente tabla ilustra claramente este punto.

arquitectura rubí DBI

arquitectura general de Ruby DBI utiliza dos capas:

  • Interfaz de base de datos (DBI) capa. Esta capa es la base de datos independiente y proporciona una serie de método de acceso público, el uso de un servidor de base de datos, independientemente del tipo de enfoque.
  • controlador de base de datos (DBD) capa. Esta capa depende de la base de datos, una unidad diferente proporciona acceso a diferentes motores de base de datos. MySQL, PostgreSQL, Interbase, Oracle, respectivamente, utilizando una unidad diferente. Cada conductor es responsable de la interpretación de las solicitudes de la capa de DBI, y estas solicitudes se asignan a aplicar a una solicitud de un tipo dado de servidor de base de datos.

instalar

Si desea escribir scripts de Ruby para acceder a la base de datos MySQL, es necesario instalar el módulo de Ruby MySQL.

Instalar el kit de desarrollo de MySQL

# Ubuntu
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient15-dev

# Centos
yum install mysql-devel

Mac OS, es necesario modificar el archivo ~ / .bash_profile o archivo ~ / .profile, agregue el código siguiente:

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

O utilizar la conexión suave:

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

Uso RubyGems instalar DBI (recomendado)

RubyGems acerca fundada en noviembre de 2003, se convirtió en parte de la biblioteca estándar de Ruby desde Ruby versión 1.9. Más detalles se pueden ver: el Rubí RubyGems

Utilice joya instalar DBI y DBD-MySQL:

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

Usa Código de instalación (versión de Ruby menos de 1,9 a usar este método)

El módulo es un DBD, de http://tmtm.org/downloads/mysql/ruby/ descarga.

Después de descargar el último paquete, descomprimir en el directorio, ejecute el siguiente comando para instalar:

% ruby extconf.rb

或者

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

或者

% ruby extconf.rb --with-mysql-config

A continuación, compile:

% make

Obtener e instalar el Rubí / DBI

Puede descargar e instalar el módulo DBI Rubí desde el siguiente enlace:

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

Antes de comenzar la instalación, asegúrese de que tiene privilegios de root. Ahora, instalar los siguientes pasos para instalar:

Paso 1

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

O directamente bajo otro comprimir y descomprimir.

Paso 2

Introduzca el directoriorubí-DBI-maestro,utilice el script de configuraciónsetup.rben el directorio. Los comandos de configuración más comunes no son seguidos por los parámetros de configuración de parámetros. El comando de configuración por defecto para instalar todos los conductores.

$ ruby setup.rb config

Más específicamente, puede utilizar la opción --with a la lista de la parte específica que desea utilizar. Por ejemplo, si desea configurar el módulo DBI principal y la unidad de la capa DBD, introduzca el siguiente comando:

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

paso 3

El último paso es la creación de la unidad, utilice el siguiente comando para instalar:

$ ruby setup.rb setup
$ ruby setup.rb install

La conectividad de base de datos

Supongamos que estamos utilizando la base de datos MySQL antes de conectarse a la base de datos, asegúrese de que:

  • Se ha creado una base de datos TESTDB.
  • Ha creado la tabla EMPLOYEE en TESTDB.
  • La tabla con un campo FIRST_NAME, APELLIDOS, edad, sexo e ingresos.
  • Programar una ID de usuario "testuser" y el "test123" contraseña para acceder a TESTDB
  • Ya en su máquina correctamente instalado el módulo DBI Rubí.
  • Usted ha visto MySQL tutorial, la comprensión de la MySQL operativo subyacente.

Los siguientes son ejemplos de las conexiones MySQL base de datos "TESTDB" de:

#!/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

Cuando se ejecuta este script, producirá los siguientes resultados en una máquina Linux.

Server version: 5.0.45

Si se establece una conexión con una fuente de datos, el mango de la base de datos devuelto (manija de base de datos), y se guarda en eldap para su uso posterior, o dapse establecerá enun valor nulo,yee.err:: errstrdevolver el código de error y el error cadena.

Por último, antes de salir de este programa, asegúrese de cerrar la conexión de base de datos, la liberación de los recursos.

operación INSERT

Cuando se desea crear un registro en una tabla de base de datos, es necesario utilizar operación INSERT.

Una vez que una conexión de base de datos, estamos listos para crear una tabla o insertar datos en la tabla para crear un método de impresión que utiliza unhacer o prepararyejecutarmétodos.

Uso hacer declaración

La declaración no devuelve filas llamando alhacer los métodos de procesamiento de base de datos.Este método toma un parámetro de cadena de instrucción y devuelve el número de filas afectadas por la sentencia.

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

Del mismo modo, se puede ejecutarunainstrucción SQLINSERTpara crear registros en la tabla EMPLEADO.

#!/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

El uso deprepararyejecutar

Puede utilizarprepararyejecutarel método de DBI para ejecutar sentencias SQL de código Ruby.

Para crear un registro de la siguiente manera:

  • sentencia SQL preparada con la instrucción INSERT. Esto se logrará mediante el usopreparar método.
  • Ejecutar la consulta SQL, seleccionar todos los resultados de la base de datos. Esto se logrará medianteel método de ejecutar.
  • Liberar el identificador de instrucción. Esto se logrará mediante el uso deAPI acabado.
  • Si todo va bien, entonces la operación deconfirmación, o puede completar la reversión delatransacción.

A continuación se muestra la sintaxis de estos dos métodos:

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

Ambos métodos se pueden utilizar paraenlazar un valor a pasar las sentencias SQL.A veces, el valor es introducido no se puede dar por adelantado, en este caso, se utiliza para enlazar los valores. Utilice un signo de interrogación(?) En lugar del valor real, el valor real pase a través de ejecutar () de la API.

El siguiente ejemplo crea dos registros de la tabla EMPLEADO:

#!/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

Si utiliza múltiples INSERT, luego la primera a preparar una declaración, y luego ejecutar varias veces en un bucle a través de cada ciclo de lo que llama a hacer mucho más eficiente.

operación READ

operación de lectura en cualquier base de datos se refiere a obtener información útil de la base de datos.

Una vez que una conexión de base de datos, estamos listos para consultar la base de datos. Podemos utilizar un método oqué prepararyejecutarel método para obtener el valor de una tabla de base de datos.

Obtener el paso registra como sigue:

  • Sobre la base de las condiciones requeridas para la preparación de las consultas SQL. Esto se logrará mediante el usopreparar método.
  • Ejecutar la consulta SQL, seleccionar todos los resultados de la base de datos. Esto se logrará medianteel método de ejecutar.
  • Uno por uno para obtener resultados y emite los resultados. Esto se logrará mediante el uso de métodosde captación.
  • Liberar el identificador de instrucción. Esto se logrará mediante el uso de métodosde acabado.

El siguiente ejemplo de consulta de todo el salario (sueldo) registró más de 1.000 de la tabla 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 "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
ensure
     # 断开与服务器的连接
     dbh.disconnect if dbh
end

Esto produce los siguientes resultados:

First Name: Mac, Last Name : Mohan
Age: 20, Sex : M
Salary :2000

First Name: John, Last Name : Poul
Age: 25, Sex : M
Salary :2300

Hay muchos métodos para obtener los registros de la base de datos, si está interesado, puede ver el funcionamiento de Ruby Lee DBI .

Operación de actualización

Cualquier operación de actualización de la base se refiere a los registros existentes de uno o más de actualización de base de datos. El ejemplo siguiente actualiza el sexo es 'M' para todos los registros. A continuación, vamos a añadir un año todos los hombres en edad. Se puede dividir en tres pasos:

  • Sobre la base de las condiciones requeridas para la preparación de las consultas SQL. Esto se logrará mediante el usopreparar método.
  • Ejecutar la consulta SQL, seleccionar todos los resultados de la base de datos. Esto se logrará medianteel método de ejecutar.
  • Liberar el identificador de instrucción. Esto se logrará mediante el uso de métodosde acabado.
  • Si todo va bien, entonces la operación deconfirmación, o puede completar la reversión delatransacción.
#!/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

operación DELETE

Cuando se quiere eliminar registros de la base de datos, es necesario utilizar la operación de eliminación. Los siguientes ejemplos eliminar EDAD 20 sobre todos los registros de empleado. Los pasos de la operación son los siguientes:

  • Sobre la base de las condiciones requeridas para la preparación de las consultas SQL. Esto se logrará mediante el usopreparar método.
  • Ejecutar consultas SQL, elimine los registros deseados de la base de datos. Esto se logrará medianteel método de ejecutar.
  • Liberar el identificador de instrucción. Esto se logrará mediante el uso de métodosde acabado.
  • Si todo va bien, entonces la operación deconfirmación, o puede completar la reversión delatransacción.
#!/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

Asuntos ejecutivos

Una transacción es un mecanismo para garantizar la coherencia de transacciones. Los servicios deben tener los cuatro atributos siguientes:

  • La atomicidad (atomicidad): atomicidad de la transacción significa que el programa está incluido en la transacción como una unidad lógica de la base de datos de trabajo, que hace las operaciones de modificación de datos o bien todos ejecutan o no en absoluto.
  • Coherencia (consistencia): Transacción deconsistencia se refiere a una operación ejecutada antes y después de la implementación de la base de datos debe estar en un estado coherente. Si el estado de la base de datos cumple con todas las restricciones de integridad, por ejemplo la base de datos es coherente.
  • Aislamiento (aislamiento): aislamiento de transacción se refiere a aisladas unas de otras las transacciones simultáneas, es decir, dentro de una transacción de datos de operación y funcionamiento deben ser selladas, no se ve otros intentos de modificar la transacción.
  • Persistente (Durabilidad): la durabilidad de transacción significa que cuando un sistema o medios fracaso, comprometido transacciones para garantizar que las actualizaciones no se pueden perder.Que una vez que se confirma una transacción, modificar los datos en la base de datos deben ser permanentes, soportar cualquier fallo en el sistema de base de datos. Persistente garantizado por el respaldo y la recuperación de base de datos.

DBI ofrece dos maneras de realizar la transacción. Se trata de los métodosdeconfirmación oretrotracciónpara confirmar o deshacer la transacción. También hay un método detransacciónse puede utilizar para poner en práctica la transacción. A continuación presentamos dos método sencillo de implementar transacciones:

Método I

El primer método utilizaconfirmarydeshacermétodos de DBI para cometer explícita o cancelar la transacción:

   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

Método II

El segundo método utiliza el método detransacción.Este método es relativamente sencillo, ya que requiere una transacción constituye un bloque de código que contiene la declaración. método detransacciónejecuta el bloque, y luego el bloque se ejecuta con éxito, automáticamente invocanconfirmarodeshacer:

   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

COMMIT operación

Comprometerse es una operación que se haya completado para identificar los cambios de base de datos, y después de esta operación, todos los cambios no son recuperables.

Aquí está un ejemplo sencillocometer invocación de método.

     dbh.commit

operación de reversión

Si usted no está satisfecho con uno o unos pocos cambios, que desea restaurar por completo estos cambios, utilice el métodorollback.

Este es un simple ejemplo de llamada al métodorollback.

     dbh.rollback

Desconectar la base de datos

Para desconectarse de la base de datos, utilice la API de desconexión.

    dbh.disconnect

Si el usuario cierra el método de desconexión conexión de base de datos, DBI deshace todas las transacciones incompletas. Sin embargo, no se basa en los detalles de la implementación de cualquier DBI, y su aplicación puede ser una buena llamada explícita a confirmar o deshacer.

error de procesamiento

Hay muchas fuentes diferentes de error. Por ejemplo, errores de sintaxis en la aplicación de la instrucción SQL o la conexión falla, o es una declaración completa o un mango llamadas canceladas traen método.

Si un método falla DBI, DBI lanzará una excepción. DBI método puede lanzar cualquier tipo de excepción, sino la clase de excepción dos más importantes esDBI ::DBI ::InterfaceErroryDatabaseError.

los objetos de excepción de estas clases sonerr,errstr tres atributos yestado,sub-tabla representa el número de error, una cadena de error descriptivo y un código de error estándar. Atributo especificado como sigue:

  • err: devuelve un error número entero que se produjo la notación, si DBD no es compatible con el retorno decero.Por ejemplo, Oracle DBD devoluciones sección de mensajes de error ORA-XXXX.
  • cadena_err: Devuelve una cadena que representa el error que se produjo.
  • Estado: Devuelve el código de error se produjo SQLSTATE.SQLSTATE es una longitud de cadena de cinco caracteres. La mayor parte del DBD no lo soporte, devolverá cero.

En el ejemplo anterior, usted ha visto el código siguiente:

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

Para obtener información de depuración sobre el contenido de la secuencia de comandos se ejecuta cuando se ejecuta la secuencia de comandos, puede habilitar el seguimiento. Para ello, primero debe descargar el módulo DBI / huella, y luego llamar seguimiento modo de control y método de salida de destino delrastreo:

require "dbi/trace"
..............

trace(mode, destination)

Modo de valor puede ser 0 (off), 1,2, o 3, el valor del destino debe ser un objeto IO. Los valores por defecto son 2 y STDERR.

método de bloques

Hay maneras de crear un mango. Estos métodos son invocados por el bloque de código. Ventajas del uso de bloques de código con el método es que proporcionan un asa para el bloque como argumento cuando el bloque se termina mango borra automáticamente. He aquí algunos ejemplos para ayudar a entender este concepto.

  • DBI.connect: Este método genera un identificador de base de datos, se recomienda al final de la llamada del bloquede desconexiónpara desconectar la base de datos.
  • dbh.prepare: Este método genera un identificador de instrucción, recomienda llamaracabadoal final del bloque.Dentro de un bloque, se debe llamar al método deejecuciónpara ejecutar la instrucción.
  • dbh.execute: Este método es similar al dbh.prepare, pero no dbh.execute necesita llamar a ejecutar método dentro del bloque.Un controlador de instrucción se ejecuta de forma automática.

Ejemplo 1

DBI.connect puede tener un bloque de código, pasándole el mango base de datos, y el mango se desconectará automáticamente al final del bloque.

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

Ejemplo 2

dbh.prepare puede tener un bloque de código, pasando el identificador de instrucción, y pide automáticamente de meta al final del bloque.

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

Ejemplo 3

dbh.execute puede tener un bloque de código, pasando el identificador de instrucción, y pide automáticamente de meta al final del bloque.

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

método de transacciónDBItambién puede estar provisto de un bloque de código, que en las secciones anteriores se han explicado antes.

funciones y propiedades específicas del controlador

Deje controlador de base de datos DBI ofrece funciones adicionales de base de datos específica, estas funciones pueden ser llamados por cualquier método objeto de la manijafuncusuario.

Utilice[] = ométodo[]para establecer u obtener atributos controladores específicos.

DBD :: MySQL implementa la función después de un controlador específico:

No. Función y Descripción
1 dbh.func (: createdb, nombre_base_de_datos)
Crear una nueva base de datos.
2 dbh.func (: dropdb, nombre_base_de_datos)
Para eliminar una base de datos.
3 dbh.func (: recarga)
Actualizar operación.
4 dbh.func (: apagado)
Cierre el servidor.
5 dbh.func (: insert_id) => Fixnum
Devuelve el valor AUTO_INCREMENT reciente de la conexión.
6 dbh.func (: client_info) => Cadena
Devuelve la información de la versión del cliente de MySQL requiere.
7 dbh.func (: client_version) => Fixnum
Dependiendo de la información de la versión de vuelta al cliente. Esto es: Similar a client_info, pero va a devolver un fixnum, en lugar de devolver una cadena.
8 dbh.func (: host_info) => Cadena
Devuelve la información de la máquina.
9 dbh.func (: proto_info) => Fixnum
Devuelve los protocolos utilizados para la comunicación.
10 dbh.func (: server_info) => Cadena
Devuelve la información de versión del servidor MySQL basada.
11 dbh.func (: stat) => Stringb >
Devuelve el estado actual de la base de datos.
12 dbh.func (: thread_id) => Fixnum
Devuelve el ID del hilo actual.

Ejemplos

#!/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

Esto produce los siguientes resultados:

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