Ruby DBI: операции чтения

DBI предоставляет несколько различных способов извлечения записей из базы данных. Предположим,dbh— это дескриптор базы данных,sth— дескриптор оператора:

Нет.Метод и описание
1db.select_one( stmt, *bindvars ) => aRow | nil
Выполняет оператор с привязаннымиbindvarsперед маркерами параметровstmtоператора. Возвращает первую строку; если результирующий набор пуст, возвращаетnil。
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nil

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

Выполняет инструкцию сbindvars, привязанными перед маркерами параметров инструкцииstmt. При вызове без блока этот метод возвращает массив, содержащий все строки. Если блок передан, он вызывается для каждой строки.
3sth.fetch => aRow | nil
Возвращаетследующую строку. Если в результате нет следующей строки, возвращаетnil。
4sth.fetch { |aRow| aBlock }
Вызывает заданный блок для оставшихся строк в наборе результатов.
5sth.fetch_all => [aRow, ...]
Возвращает все оставшиеся строки набора результатов, сохранённые в массиве.
6sth.fetch_many( count ) => [aRow, ...]
Возвращает строку, отстоящую на offset строк вниз, сохранённую в массиве [aRow, ...]countrow.
7sth.fetch_scroll( direction, offset=1 ) => aRow | nil
Возвращает указанную строку с помощью параметраdirectionи параметраoffset. За исключением SQL_FETCH_ABSOLUTE и SQL_FETCH_RELATIVE, все остальные методы игнорируют параметрoffset。directionВозможные значения параметра приведены в следующей таблице.
8sth.column_names => anArray
Возвращает имена столбцов.
9column_info => [ aColumnInfo, ... ]
Возвращает массив объектов DBI::ColumnInfo. Каждый объект хранит информацию о столбце и содержит имя столбца, тип, точность и другие дополнительные сведения.
10sth.rows => rpc
Возвращает количество строк, обработанных операторомCount, если такого числа нет, возвращаетnil。
11sth.fetchable? => true | false
Если строки можно извлечь, возвращаетtrue, в противном случае возвращаетfalse。
12sth.cancel
Освобождает ресурсы, удерживаемые набором результатов. После вызова этого метода вы больше не сможете извлекать строки, если не вызовете сноваexecute。
13sth.finish
Освобождает ресурсы, удерживаемые подготовленным выражением. После вызова этого метода вы не можете вызывать какие-либо дальнейшие методы операций для этого объекта.

параметр direction

Следующие значения можно использовать для параметра direction методаfetch_scroll:

КонстантаОписание
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"]
      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

Это даст следующий результат:

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
Другие расширения