Ruby Opérations de lecture DBI

DBI fournit plusieurs façons différentes de récupérer des enregistrements dans une base de données. Supposons quedbhsoit un descripteur de base de données,sthsoit un descripteur d'instruction :

Non.Metode & Deskripsi
1db.select_one( stmt, *bindvars ) => aRow | nil
Exécute l'instruction avec lesbindvarsliés avant les marqueurs de paramètres destmtinstruction. Renvoie la première ligne ; si le jeu de résultats est vide, renvoienil。
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nil

db.select_all( stmt, *bindvars ){ |aRow| aBlock }

Exécute l'instruction avecbindvarsliés avant les marqueurs de paramètresstmtinstruction. Appelée sans bloc, cette méthode renvoie un tableau contenant toutes les lignes. Si un bloc est donné, il est appelé pour chaque ligne.
3sth.fetch => aRow | nil
Renvoiela ligne suivante. S'il n'y a pas de ligne suivante dans le résultat, renvoienil。
4sth.fetch { |aRow| aBlock }
Appelle le bloc donné pour les lignes restantes du jeu de résultats.
5sth.fetch_all => [aRow, ...]
Renvoie toutes les lignes restantes du jeu de résultats stockées dans un tableau.
6sth.fetch_many( count ) => [aRow, ...]
Renvoie la ligne située offset positions plus bas, stockée dans le tableau [aRow, ...]countligne.
7sth.fetch_scroll( direction, offset=1 ) => aRow | nil
Renvoiedirectionle paramètre etoffsetla ligne spécifiée. À l'exception de SQL_FETCH_ABSOLUTE et SQL_FETCH_RELATIVE, toutes les autres méthodes ignorent le paramètreoffset。directionLes valeurs possibles pour le paramètre sont données dans le tableau suivant.
8sth.column_names => anArray
Renvoie les noms des colonnes.
9column_info => [ aColumnInfo, ... ]
Renvoie un tableau d'objets DBI::ColumnInfo. Chaque objet stocke des informations sur une colonne et contient le nom de la colonne, son type, sa précision et d'autres informations supplémentaires.
10sth.rows => rpc
Renvoie le nombre de lignes traitées par l'instructionCount, s'il n'y a pas de tel nombre, renvoienil。
11sth.fetchable? => true | false
Si des lignes peuvent être récupérées, renvoietrue, sinon renvoiefalse。
12sth.cancel
Libère les ressources détenues par l'ensemble de résultats. Après avoir appelé cette méthode, vous ne pouvez plus récupérer de lignes sauf si vous appelez à nouveauexecute。
13sth.finish
Libère les ressources détenues par la requête préparée. Après avoir appelé cette méthode, vous ne pouvez plus appeler d'autres méthodes d'opération sur cet objet.

paramètre direction

Les valeurs suivantes peuvent être utilisées pour le paramètre direction de la méthodefetch_scroll:

ConstanteDescription
DBI::SQL_FETCH_FIRSTRécupère la première ligne.
DBI::SQL_FETCH_LASTRécupère la dernière ligne.
DBI::SQL_FETCH_NEXTRécupère la ligne suivante.
DBI::SQL_FETCH_PRIORRécupère la ligne précédente.
DBI::SQL_FETCH_ABSOLUTERécupère la ligne au décalage spécifié.
DBI::SQL_FETCH_RELATIVERécupère la ligne au décalage spécifié par rapport à la ligne actuelle.

Exemples

L'exemple suivant montre comment récupérer les métadonnées d'une instruction. Supposons que nous ayons une table 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)
     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

Cela produira le résultat suivant :

Statement has a result set
Number of rows: 5
Number of columns: 5
--- Column 0 (FIRST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 4
mysql_flags:      0
--- Column 1 (LAST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 5
mysql_flags:      0
--- Column 2 (AGE) ---
sql_type:         4
type_name:        INTEGER
precision:        11
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       3
mysql_type_name:  INT
mysql_length:     11
mysql_max_length: 2
mysql_flags:      32768
--- Column 3 (SEX) ---
sql_type:         12
type_name:        VARCHAR
precision:        1
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     1
mysql_max_length: 1
mysql_flags:      0
--- Column 4 (INCOME) ---
sql_type:         6
type_name:        FLOAT
precision:        12
scale:            31
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       4
mysql_type_name:  FLOAT
mysql_length:     12
mysql_max_length: 4
mysql_flags:      32768
Autres extensions