§ Sequel. Инструмент для легкой работы с БД.

В работе системного администратора частенько возникают задачи, когда нужно перелопатить данные из базы данных, и произвести какие то действия с ними. Для работы с базами данных существуют немало библиотек, например ActiveRecords или DataMapper, но все они перед тем как предоставить возможность работы с данными требуют описать структуру этих данных в базе, и зачастую гораздо проще самостоятельно написать SQL запросы.

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

Модуль называется sequel (сиквел), примерно так на английском и звучит аббривитаура SQL. Сам по себе модуль очень простой, поддерживает из коробки огромное количество баз данных. Установка происходит как обычно через gem.

# gem install sequel

Далее можно приступать к работе

require 'sequel'

# создаем sqlite БД в RAM
database = Sequel.sqlite
# создаем или подключаем sqlite БД
database = Sequel.sqlite('database.db')
# или подключаем PgSQL
database = Sequel.connect('postgres://user@pass:hostname/database')
# или любую другую
database = Sequel.connect(
                            :adapter => adapter, 
                            :host => host, 
                            :port => port, 
                            :user => user,
                            :password => password)

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

Представим что у нас есть база данных которая имеет две таблицы users и posts. Тогда для того что бы получить список всех значений всех полей достаточно выполнить

users = database[:users]
posts = database[:posts]

users.to_a # => [{:id => 1, :name => "John"}, {:id => 2, :name => "Mary}]
posts.to_a # => [{:id => 1, :title => "Post 1", :body => "some text}, {:id => 2, :title => [.....]

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

posts = database[:posts].where[:user_id => 2].where[:visible => true].limit(10)

posts.each do |post|
    puts post[:title]
end

Это чем то напоминает практически ванильный SQL, но тем не менее подобные конструкции здорово помогают упростить рутинные операции. 

Ещё одним существенным приемуществом можно указать возможность не только делать выборки, но и создавать новые таблицы, удалять таблицы, вставлять записи.

database.create_table :items do
    primary_key :id
    String :name
end

items = database[:items]
items.insert(:name => "John")
items.insert(:name => "Mary")
items.count # => 2

Но даже если этого вам мало - то в конце концов можно использовать даже обычный SQL запрос типа

database.fetch('SELECT * FROM items LIMIT 10;')
database.run('DROP TABLE items;')

Отличие #fetch от #run в том, что run не возвращает полученных значений, поэтому run имеет смысл использовать на операциях которые не требуют возврата информации, вставка, удаление таблиц и тд. fetch же вернет массив хешей со значениями (если таковые будут), либо пустой массив.

Ещё sequel позволяет посмотреть на схему таблицы

database.schema[:items]

Словом модуль годный, и вполне позволяет упростить работу с базой данных для автоматизации рутинных задач. Конечно модуль предлагает не объектно-ориентированный подход как это реализовано в DataMapper или ActiveRecords, но тем не менее имеет право на жизнь и существование.


comments powered by Disqus