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