Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

books.insert(book)

В любом случае метод

insert
возвращает идентификатор строки, соответствующей новой записи (вы можете использовать его или игнорировать). Это «скрытое» автоинкрементное поле, присутствующее в каждой записи любой таблицы. Для выборки записей служит метод
select
. Без параметров он выбирает все поля всех записей таблицы. Набор полей можно ограничить, передав в качестве параметров символы. Если задан блок, то он определяет, какие записи отбирать (примерно так же, как работает метод
find_all
для массивов).

list1 = people.select #
Все люди, все поля.

list2 = people.select(:name,:age) # Все люди, только имя и возраст.

list3 = people.select(:name) {|x| x.age >= 18 && x.age < 30 }

# Имена всех людей от 18 до 30 лет.

В блоке допустимы любые операции. Это означает, например, что можно формулировать запрос с помощью регулярных выражений (в отличие от типичной SQL-базы).

Результирующий набор, возвращаемый KirbyBase, можно сортировать по нескольким ключам в порядке возрастания или убывания. Для сортировки по убыванию перед именем ключа ставится минус. (Это работает, потому что в класс

Symbol
добавлен метод, соответствующий унарному минусу.)

sorted = people.select.sort(:name,-:age)

# Отсортировать в порядке возрастания name и в порядке убывания age.

У результирующего набора есть одно интересное свойство: он может предоставлять массивы, «срезающие» результат. С первого раза это довольно трудно понять.

Предположим, что есть результирующий набор записей, представляющих людей, и в каждой записи хранятся имя, возраст, рост и вес. Понятно, что этот результирующий набор можно индексировать как массив, но одновременно он имеет методы, названные так же, как поля. Каждый такой метод возвращает массив значений только соответствующего ему поля. Например:

list = people.select(:name,:age,:heightweight)

p list[0] # Вся информация о человеке 0.

p list[1].age # Только возраст человека 1.

p list[2].height # Рост человека 2.

ages = list.age # Массив: возрасты всех людей.

names = list.name # Массив: имена всех людей.

В KirbyBase есть ограниченные средства печати отчетов; достаточно вызвать метод

to_report
для любого результирующего набора. Пример:

rpt = books.select.sort(:title).to_report

puts rpt

# Выводится:

# recno | title | author

# -----------------------------------------------------------

# 2 | Democracy in America | Alexis de Tocqueville

# 1 | The Case for Mars | Robert Zubrin

# 3 | The Ruby Way | Hal Fulton

Атрибут таблицы

encrypt
можно установить в
true
— тогда данные нельзя будет читать и редактировать, как обычный текст. Но имейте в виду, что для этого применяется шифр Вигенера — не «игрушечный», но и не являющийся криптографически безопасным. Так что пользоваться шифрованием имеет смысл только для
того, чтобы помешать редактированию, но никак не для сокрытия секретных данных. Обычно режим шифрования устанавливается в блоке при создании таблицы:

db.create_table(:mytable, f1, :String, f2, :Date) {|t| t.encrypt = true }

Поскольку удаленный доступ — интересное средство, уделим ему немного внимания. Вот пример сервера:

require 'kirbybase'

require 'drb'

host = 'localhost'

port = 44444

db = KirbyBase.new(:server) # Создать экземпляр базы данных.

DRb.start_service("druby://#{host} :#{port)", db)

DRb.thread.join

Это прямое применение интерфейса dRuby (см. главу 20). На стороне клиента следует при подключении к базе данных задать символ

:client
вместо обычного
:local
.

db = KirbyBase.new(:client,'localhost',44444)

# Весь остальной код не изменяется.

Можно также выполнять обычные операции: обновлять и удалять записи, удалять таблицы и т.д. Есть и более сложные механизмы, о которых я не буду рассказывать подробно: связи один-ко-многим, вычисляемые поля и нестандартные классы записей. Подробнее см. документацию по KirbyBase на сайте RubyForge.

10.4. Подключение к внешним базам данных

Благодаря усилиям многих людей Ruby может взаимодействовать с разными базами данных, от монолитных систем типа Oracle до более скромного MySQL. Для полноты описания мы включили в него также текстовые файлы в формате CSV.

Уровень функциональности, реализованный в этих пакетах, постоянно изменяется. Обязательно познакомьтесь с последней версией документации в сети. Неплохой отправной точкой станет архив приложений Ruby.

10.4.1. Интерфейс с SQLite

SQLite — популярная база данных для тех, кто ценит программное обеспечение, которое не нужно конфигурировать. Это небольшая автономная исполняемая программа, написанная на языке С, которая хранит всю базу данных в одном файле. Хотя обычно она используется для небольших баз, но теоретически способна управиться с терабайтными объемами.

Привязка Ruby к SQLite довольно прямолинейна. API, написанный на С, обернут в класс

SQLite::API
. Поскольку при этом методы отображаются один в один и интерфейс не назовешь образцом объектной ориентированности, пользоваться этим API стоит только в случае острой необходимости.

В большинстве ситуаций вам будет достаточно класса

SQLite::Database
. Вот пример кода:

require 'sqlite'

db = SQLite::Database.new("library.db")

db.execute("select title,author from books") do |row|

 p row

end

db.close

# Выводится:

# ["The Case for Mars", "Robert Zubrin"]

Поделиться:
Популярные книги

Битва за Изнанку

Билик Дмитрий Александрович
7. Бедовый
Фантастика:
городское фэнтези
мистика
5.00
рейтинг книги
Битва за Изнанку

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Вперед в прошлое 4

Ратманов Денис
4. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое 4

Идеальный мир для Демонолога

Сапфир Олег
1. Демонолог
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Демонолога

Последний Паладин. Том 3

Саваровский Роман
3. Путь Паладина
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 3

Как я строил магическую империю 7

Зубов Константин
7. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 7

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Практик

Листратов Валерий
5. Ушедший Род
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Практик

Тринадцатый XI

NikL
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Тринадцатый XI

Хозяин оков II

Матисов Павел
2. Хозяин Оков
Фантастика:
юмористическое фэнтези
попаданцы
фэнтези
5.00
рейтинг книги
Хозяин оков II

Развод. Без права на ошибку

Ярина Диана
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод. Без права на ошибку

Ярар X. Война. Том II

Грехов Тимофей
10. Ярар
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ярар X. Война. Том II

"Фантастика 2025-30". Компиляция. Книги 1-31

Шмаков Алексей Семенович
Фантастика:
боевая фантастика
фэнтези
5.00
рейтинг книги
Фантастика 2025-30. Компиляция. Книги 1-31

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение