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 |
|---|---|
| 1 | db.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。 |
| 2 | db.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. |
| 3 | sth.fetch => aRow | nil Renvoiela ligne suivante. S'il n'y a pas de ligne suivante dans le résultat, renvoienil。 |
| 4 | sth.fetch { |aRow| aBlock } Appelle le bloc donné pour les lignes restantes du jeu de résultats. |
| 5 | sth.fetch_all => [aRow, ...] Renvoie toutes les lignes restantes du jeu de résultats stockées dans un tableau. |
| 6 | sth.fetch_many( count ) => [aRow, ...] Renvoie la ligne située offset positions plus bas, stockée dans le tableau [aRow, ...]countligne. |
| 7 | sth.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. |
| 8 | sth.column_names => anArray Renvoie les noms des colonnes. |
| 9 | column_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. |
| 10 | sth.rows => rpc Renvoie le nombre de lignes traitées par l'instructionCount, s'il n'y a pas de tel nombre, renvoienil。 |
| 11 | sth.fetchable? => true | false Si des lignes peuvent être récupérées, renvoietrue, sinon renvoiefalse。 |
| 12 | sth.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。 |
| 13 | sth.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:
| Constante | Description |
|---|---|
| DBI::SQL_FETCH_FIRST | Récupère la première ligne. |
| DBI::SQL_FETCH_LAST | Récupère la dernière ligne. |
| DBI::SQL_FETCH_NEXT | Récupère la ligne suivante. |
| DBI::SQL_FETCH_PRIOR | Récupère la ligne précédente. |
| DBI::SQL_FETCH_ABSOLUTE | Récupère la ligne au décalage spécifié. |
| DBI::SQL_FETCH_RELATIVE | Ré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: 32768Autres extensions