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
1db.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。
2db.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.
3sth.fetch => aRow | nil
Gibtdie nächste Zeilezurück. Wenn es keine nächste Zeile im Ergebnis gibt, wirdnil zurückgegeben.。
4sth.fetch { |aRow| aBlock }
Ruft den angegebenen Block für die verbleibenden Zeilen in der Ergebnismenge auf.
5sth.fetch_all => [aRow, ...]
Gibt alle verbleibenden Zeilen der Ergebnismenge zurück, die in einem Array gespeichert sind.
6sth.fetch_many( count ) => [aRow, ...]
Gibt die offset-te Zeile darunter zurück, gespeichert im [aRow, ...]-ArraycountZeile.
7sth.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.
8sth.column_names => anArray
Gibt die Namen der Spalten zurück.
9column_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.
10sth.rows => rpc
Gibt die Anzahl der von der Anweisung verarbeiteten Zeilen zurückCount, wenn es keine solche Zahl gibt, gibtnil zurück。
11sth.fetchable? => true | false
Wenn Zeilen abgerufen werden können, wirdtruezurückgegeben, andernfalls wirdfalse zurückgegeben。
12sth.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。
13sth.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:

KonstanteBeschreibung
DBI::SQL_FETCH_FIRSTRuft die erste Zeile ab.
DBI::SQL_FETCH_LASTRuft die letzte Zeile ab.
DBI::SQL_FETCH_NEXTRuft die nächste Zeile ab.
DBI::SQL_FETCH_PRIORRuft die vorherige Zeile ab.
DBI::SQL_FETCH_ABSOLUTERuft die Zeile am angegebenen Offset ab.
DBI::SQL_FETCH_RELATIVERuft 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:      32768
Andere Erweiterungen