El mejor tutorial de Rubí acceso a la base de datos - Tutorial DBI en 2024. En este tutorial podrás aprender arquitectura de la aplicación de DBI,instalar,La conectividad de base de datos,operación INSERT,Uso hacer declaración,El uso deprepararyejecutar,operación READ,Operación de actualización,operación DELETE,Asuntos ejecutivos,Método I,Método II,COMMIT operación,operación de reversión,Desconectar la base de datos,error de procesamiento,método de bloques,funciones y propiedades específicas del controlador,Ejemplos,
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:
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 general de Ruby DBI utiliza dos capas:
Si desea escribir scripts de Ruby para acceder a la base de datos MySQL, es necesario instalar el módulo de Ruby 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
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
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
Supongamos que estamos utilizando la base de datos MySQL antes de conectarse a la base de datos, asegúrese de que:
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.
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.
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
Puede utilizarprepararyejecutarel método de DBI para ejecutar sentencias SQL de código Ruby.
Para crear un registro de la siguiente manera:
A continuación se muestra la sintaxis de estos dos métodos:
sth = dbh.prepare(statement) sth.execute es. zero or more SQL operations es. 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 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:
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
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:
#!/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
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:
#!/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
Una transacción es un mecanismo para garantizar la coherencia de transacciones. Los servicios deben tener los cuatro atributos siguientes:
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:
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
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
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
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
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.
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:
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" eseseseseseses 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.
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 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|
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
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.
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. |
#!/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