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

Operación de lectura DBI de Ruby

DBI ofrece varios métodos diferentes para obtener registros de la base de datos. Supongamos dbh es un manejador de base de datos:sth es un manejador de sentencia:

número de secuenciamétodo & descripción
1db.select_one( stmt, *bindvars ) => aRow | nulo
ejecutar con bindvars vinculado antes de la marca de parámetro stmt sentencia. Devuelve la primera fila, si el conjunto de resultados está vacío, devuelve nulo
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nulo
db.select_all( stmt, *bindvars ){ |aRow| aBlock }

ejecutar con bindvars vinculado antes de la marca de parámetro stmt sentencia. Al llamar a este método sin bloque, devuelve un array que contiene todas las filas. Si se proporciona un bloque, se llama a este método para cada fila.
3sth.fetch => aRow | nulo
devuelvela siguiente fila. Si no hay la siguiente fila en los resultados, devuelve nulo
4sth.fetch { |aRow| aBlock }
llama al bloque dado para las filas restantes del conjunto de resultados.
5sth.fetch_all => [aRow, ...]
devuelve todas las filas restantes del conjunto de resultados almacenadas en el array.
6sth.fetch_many( count ) => [aRow, ...]
devuelve la posición hacia abajo del número especificado en el array [aRow, ...]. count fila.
7sth.fetch_scroll( direction, offset=1 ) => aRow | nulo
devuelve direction y offset fila especificada. Además de SQL_FETCH_ABSOLUTE y SQL_FETCH_RELATIVE, otros métodos descartarán los parámetros offsetdirection valores posibles del parámetro, consulte la tabla a continuación.
8sth.column_names => anArray
devuelve el nombre de la columna.
9column_info => [ aColumnInfo, ... ]
devuelve un array de objetos DBI::ColumnInfo. Cada objeto almacena información sobre una columna, incluyendo el nombre de la columna, el tipo, la precisión y otros detalles adicionales.
10sth.rows => rpc
devuelve el número de filas procesadas por la sentencia de ejecución Countde lo contrario, devuelve nulo
11sth.fetchable? => verdadero | falso
devuelve verdadero si es posible obtener filas verdaderode lo contrario, devuelve falso
12sth.cancel
liberar los recursos ocupados por el conjunto de resultados. Después de llamar a este método, ya no puede obtener filas, a menos que llame a ejecutar
13sth.finish
Libera los recursos ocupados por la declaración preparada. Después de llamar a este método, no se pueden llamar a otros métodos de operación adicionales en el objeto.

parámetro de dirección

Los siguientes valores se pueden usar fetch_scroll El parámetro de dirección del método:

ConstanteDescripción
DBI::SQL_FETCH_FIRSTObtener la primera fila.
DBI::SQL_FETCH_LASTObtener la última fila.
DBI::SQL_FETCH_NEXTObtener la siguiente fila.
DBI::SQL_FETCH_PRIORObtener la fila anterior.
DBI::SQL_FETCH_ABSOLUTEObtener la fila en el desplazamiento desde esta posición.
DBI::SQL_FETCH_RELATIVEObtener la fila en el desplazamiento desde la fila actual.

Ejemplo en línea

El siguiente ejemplo demuestra cómo obtener los metadatos de una declaración. Supongamos que tenemos la tabla EMPLOYEE.

#!/usr/bin/ruby -w
require "dbi"
begin
     # Conectar al servidor MySQL
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
                        "testuser", "test123")
     sth = dbh.prepare("SELECT * FROM EMPLOYEE 
                        WHERE INCOME > ?")
     sth.execute(1000)
     if sth.column_names.size == 0 then
        puts "Statement has no result set"
        printf "Number of rows affected: %d\n", sth.rows
     else
        puts "Statement has a result set"
        rows = sth.fetch_all
        printf "Number of rows: %d\n", rows.size
        printf "Number of columns: %d\n", sth.column_names.size
        sth.column_info.each_with_index do |info, i|
          printf ""--- Column %d (%s) ---\n, i, info["name"]
          printf "sql_type:                            %s\n", info["sql_type"]
          printf "type_name:        %s\n", info["type_name"]
          printf "precision:        %s\n", info["precision"]
          printf "scale:            %s\n", info["scale"]
          printf "nullable:         %s\n", info["nullable"]
          printf "indexed:          %s\n", info["indexed"]
          printf "primary:          %s\n", info["primary"]
          printf "unique:           %s\n", info["unique"]
          printf "mysql_type:       %s\n", info["mysql_type"]
          printf "mysql_type_name:  %s\n", info["mysql_type_name"]
          printf "mysql_length:     %s\n", info["mysql_length"]
          printf "mysql_max_length: %s\n", info["mysql_max_length"]
          printf "mysql_flags:      %s\n", info["mysql_flags"]
      end
   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

这将产生以下结果:

Statement has a result set
Number of rows: 5
Number of columns: 5
--- Column 0 (FIRST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precisión:        20
escala:            0
nulo:           true
indexado:          false
primario:          false
único:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 4
mysql_flags:      0
--- Columna 1 (LAST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precisión:        20
escala:            0
nulo:           true
indexado:          false
primario:          false
único:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 5
mysql_flags:      0
--- Columna 2 (AGE) ---
sql_type:         4
type_name:        INTEGER
precisión:        11
escala:            0
nulo:           true
indexado:          false
primario:          false
único:           false
mysql_type:       3
mysql_type_name:  INT
mysql_length:     11
mysql_max_length: 2
mysql_flags:      32768
--- Columna 3 (SEXO) ---
sql_type:         12
type_name:        VARCHAR
precisión:        1
escala:            0
nulo:           true
indexado:          false
primario:          false
único:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     1
mysql_max_length: 1
mysql_flags:      0
--- Columna 4 (INGRESO) ---
sql_type:         6
type_name:        FLOAT
precisión:        12
escala:            31
nulo:           true
indexado:          false
primario:          false
único:           false
mysql_type:       4
mysql_type_name:  FLOAT
mysql_length:     12
mysql_max_length: 4
mysql_flags:      32768