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

Основной учебник Ruby

Продвинутый учебник Ruby

Операции чтения 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, ...]
Возврат сохраненных в массиве [aRow, ...] элементов вниз по. count строка.
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

Следующие значения можно использовать 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 ДОХОД > ?")
     sth.execute(1000)
     if sth.column_names.size == 0 then
        puts "Запрос не имеет результатного набора"
        printf "Количество измененных строк: %d\n", sth.rows
     else
        puts "Запрос имеет результатный набор"
        rows = sth.fetch_all
        printf "Количество строк: %d\n", rows.size
        printf "Количество столбцов: %d\n", sth.column_names.size
        sth.column_info.each_with_index do |info, i|
          printf "--- Столбец %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
--- Столбец 4 (Доход) ---
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