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

Ruby DBI Read-Operation

DBI bietet verschiedene Methoden, um Aufzeichnungen aus der Datenbank abzurufen. Angenommen dbh ist ein Datenbank-Handler,sth ist ein Statement-Handler:

NummerMethode & Beschreibung
1db.select_one( stmt, *bindvars ) => aRow | nil
ausführen mit bindvars gebunden vor dem Parameterzeichen stmt Statement. Gibt die erste Zeile zurück, wenn der Result-Set leer ist, wird nil
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nil
db.select_all( stmt, *bindvars ){ |aRow| aBlock }

ausführen mit bindvars gebunden vor dem Parameterzeichen stmt Statement. Ruft den ohne Block aufrufenden Methoden, gibt ein Array mit allen Zeilen zurück. Wird ein Block gegeben, wird dieser für jede Zeile aufgerufen.
3sth.fetch => aRow | nil
wird zurückgegebennächste Zeile. Wenn im Resultat keine nächste Zeile vorhanden ist, wird nil
4sth.fetch { |aRow| aBlock }
Ruft den gegebenen Block für die verbleibenden Zeilen im Result-Set auf
5sth.fetch_all => [aRow, ...]
Gibt alle verbleibenden Zeilen des Result-Sets, die im Array gespeichert sind, zurück
6sth.fetch_many( count ) => [aRow, ...]
Gibt die Zeile zurück, die nach unten gezählt wird im Array [aRow, ...] count Zeile.
7sth.fetch_scroll( direction, offset=1 ) => aRow | nil
wird zurückgegeben direction Parameter und offset bestimmte Zeile. Alle anderen Methoden außer SQL_FETCH_ABSOLUTE und SQL_FETCH_RELATIVE werfen die Parameter weg offsetdirection Mögliche Werte für den Parameter, siehe Tabelle unten
8sth.column_names => anArray
Gibt den Namen der Spalte 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 Genauigkeit und weitere Informationen
10sth.rows => rpc
Gibt die Anzahl der Zeilen zurück, die von dem ausführenden Statement verarbeitet wurden Countwenn nicht existent, wird nil
11sth.fetchable? => true | false
wenn möglicherweise Zeilen abgerufen werden können, wird truesonst false
12sth.cancel
Lösen Sie die Ressourcen, die der Result-Set in Anspruch nimmt. Nach Aufruf dieser Methode können Sie keine Zeilen mehr abrufen, es sei denn, Sie rufen sie erneut auf ausführen
13sth.finish
释放准备语句所占有的资源。在调用该方法后,您就不能在该对象上调用其他进一步操作的方法了。

direction 参数

下面的值可用于 fetch_scroll 方法的 direction 参数:

常量描述
DBI::SQL_FETCH_FIRST获取第一行。
DBI::SQL_FETCH_LAST获取最后一行。
DBI::SQL_FETCH_NEXT获取下一行。
DBI::SQL_FETCH_PRIOR获取上一行。
DBI::SQL_FETCH_ABSOLUTE获取在该位置偏移处的行。
DBI::SQL_FETCH_RELATIVE获取距离当前行该偏移量的行。

在线示例

下面的示例演示了如何获取一个语句的元数据。假设我们有 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"]
      ende
   ende
   sth.finish
rescue DBI::DatabaseError => e
     puts "Es ist ein Fehler aufgetreten"
     puts "Fehlercode:    #{e.err}"
     puts "Fehlermeldung: #{e.errstr}"
sichern
     # Trennung der Verbindung zum Server
     dbh.disconnect if dbh
ende

Dies erzeugt folgende Ergebnisse:

Der Anweisung wird ein Ergebnisset zugewiesen
Anzahl der Zeilen: 5
Anzahl der Spalten: 5
--- Spalte 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
--- Spalte 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
--- Spalte 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
--- Spalte 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
--- Spalte 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