Ruby DBI Leseoperationen
DBI bietet verschiedene Möglichkeiten, Datensätze aus einer Datenbank abzurufen. Angenommendbhist ein Datenbank-Handle,sthist ein Statement-Handle:
| Nein. | Methode & Beschreibung |
|---|---|
| 1 | db.select_one( stmt, *bindvars ) => aRow | nil Führt das Statement mitbindvarsgebunden vor den Parameter-MarkernstmtStatement aus. Gibt die erste Zeile zurück; wenn das Ergebnis leer ist, wirdnil zurückgegeben。 |
| 2 | db.select_all( stmt, *bindvars ) => [aRow, ...] | nil db.select_all( stmt, *bindvars ){ |aRow| aBlock } Führt die Anweisung aus, wobeibindvarsvor den ParameterplatzhalternstmtAnweisung gebunden werden. Ohne Block aufgerufen, gibt diese Methode ein Array zurück, das alle Zeilen enthält. Wenn ein Block angegeben wird, wird er für jede Zeile aufgerufen. |
| 3 | sth.fetch => aRow | nil Gibtdie nächste Zeilezurück. Wenn es keine nächste Zeile im Ergebnis gibt, wirdnil zurückgegeben.。 |
| 4 | sth.fetch { |aRow| aBlock } Ruft den angegebenen Block für die verbleibenden Zeilen in der Ergebnismenge auf. |
| 5 | sth.fetch_all => [aRow, ...] Gibt alle verbleibenden Zeilen der Ergebnismenge zurück, die in einem Array gespeichert sind. |
| 6 | sth.fetch_many( count ) => [aRow, ...] Gibt die offset-te Zeile darunter zurück, gespeichert im [aRow, ...]-ArraycountZeile. |
| 7 | sth.fetch_scroll( direction, offset=1 ) => aRow | nil Gibt die durch dendirection-Parameterundoffsetangegebene Zeile zurück. Außer für SQL_FETCH_ABSOLUTE und SQL_FETCH_RELATIVE verwerfen alle anderen Methoden den Parameteroffset。directionDie möglichen Werte für den Parameter sind in der folgenden Tabelle angegeben. |
| 8 | sth.column_names => anArray Gibt die Namen der Spalten zurück. |
| 9 | column_info => [ aColumnInfo, ... ] Gibt ein Array von DBI::ColumnInfo-Objekten zurück. Jedes Objekt speichert Informationen über eine Spalte und enthält den Namen, den Typ, die Präzision und weitere zusätzliche Informationen der Spalte. |
| 10 | sth.rows => rpc Gibt die Anzahl der von der Anweisung verarbeiteten Zeilen zurückCount, wenn es keine solche Zahl gibt, gibtnil zurück。 |
| 11 | sth.fetchable? => true | false Wenn Zeilen abgerufen werden können, wirdtruezurückgegeben, andernfalls wirdfalse zurückgegeben。 |
| 12 | sth.cancel Gibt die vom Resultset gehaltenen Ressourcen frei. Nach dem Aufruf dieser Methode können Sie keine Zeilen mehr abrufen, es sei denn, Sie rufen erneutexecute auf。 |
| 13 | sth.finish Gibt die Ressourcen frei, die vom vorbereiteten Statement gehalten werden. Nach dem Aufruf dieser Methode können Sie keine weiteren Operationsmethoden für dieses Objekt aufrufen. |
direction-Parameter
Die folgenden Werte können für den direction-Parameter der Methodefetch_scrollverwendet werden:
| Konstante | Beschreibung |
|---|---|
| DBI::SQL_FETCH_FIRST | Ruft die erste Zeile ab. |
| DBI::SQL_FETCH_LAST | Ruft die letzte Zeile ab. |
| DBI::SQL_FETCH_NEXT | Ruft die nächste Zeile ab. |
| DBI::SQL_FETCH_PRIOR | Ruft die vorherige Zeile ab. |
| DBI::SQL_FETCH_ABSOLUTE | Ruft die Zeile am angegebenen Offset ab. |
| DBI::SQL_FETCH_RELATIVE | Ruft die Zeile am angegebenen Offset von der aktuellen Zeile ab. |
Beispiele
Das folgende Beispiel veranschaulicht, wie die Metadaten einer Anweisung abgerufen werden. Angenommen, wir haben eine EMPLOYEE-Tabelle.
#!/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
Dies erzeugt das folgende Ergebnis:
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: 32768Andere Erweiterungen