Миграции в SEQUEL

Posted on March 18, 2008
Для управления состоянием базы данных в Sequel имеется механизм миграций.
Миграции создаются в стиле ActiveRecord. Например

class CreateItems < Sequel::Migration 
    def up 
      create_table :items do 
        primary_key :id 
        varchar   :name, :size => 32, :unique => true 
        integer   :value
      end 
    end 

    def down 
      drop_table :items
    end 
  end 

Имена файлов так-же задаются в стиле ActiveRecord т.е. 001_create_items.rb
Для проведения миграции в приложении необходимо вызвать Sequel::Migrator.apply(DB, '.') которая проведет все миграции, если необходимо базу привести к какой-то определенной миграции то указывается версия миграций Sequel::Migrator.apply(DB, '.',5)
Для проведения единичной миграции можно воспользоваться прямым вызовом её CreateItems.apply(DB, :up)

Модели в SEQUEL

Posted on March 11, 2008
Для более абстрактной работы с данными в SEQUEL есть модели.
Модели сходны с моделями из ActiveRecord.

require 'rubygems'
require 'sequel'

DB = Sequel('sqlite:/test.db')

class Item < Sequel::Model
    validates_presence_of :name
    validates_presence_of :value
end

item1 = new Item
puts item1.errors.inspect unless item1.save
При запуске выведется сообщение об ошибках валидации произошедших при сохранении

#<Validation::Errors:0xb781ed9c @errors={:name=>["is not present"], :value=>["is not present"]}>

Ассоциации и связи моделей

Модели могут быть связаны как
  • Один к одному
  • Один ко многим
Пример:

class Item < Sequel::Model
end

class Place < Sequel::Model
    one_to_many :items, :from => Item
end

Но есть более удобный способ задания отношений между моделями:

class Item < Sequel::Model
    relationships do
        has :one, :description, :required => true
        has :many, :comments
    end
end    

Действия выполняемые при изменении модели

У моделей вызываются следующие стандартные события
  • :after_initialize
  • :before_create
  • :after_create
  • :before_update
  • :after_update
  • :before_save
  • :after_save
  • :before_destroy
  • :after_destroy

Легковесный ORM - Sequel

Posted on February 27, 2008
Работа с базой данных - довольно дорогостоящий по вычислениям процесс, особенно при использовании ActiveRecord. Поэтому иногда возможно применение простого и легковесного ORM Sequel. От ActiveRecord его отличает меньшее количество возможностей, более близкое приближение к собственно SQL.

require 'rubygems'
require 'sequel'


DB = Sequel.sqlite #используем базу данных SQLite находящуюся в памяти

DB.create_table :items do #Создание таблицы в базе данных
      column :name, :text
      column :value, :float
end

items = DB[:items] #Создаем отображение таблицы в датасет

(1..10).each do |num|
  items << {:name => "some_item_#{num}", :value => num} #Заполнение таблицы тестовыми данными
end

items.print #Вывод на печать

После запуска на выходе получим таблицу

+------------+-----+
|name        |value|
+------------+-----+
|some_item_1 |    1|
|some_item_2 |    2|
|some_item_3 |    3|
|some_item_4 |    4|
|some_item_5 |    5|
|some_item_6 |    6|
|some_item_7 |    7|
|some_item_8 |    8|
|some_item_9 |    9|
|some_item_10|   10|
+------------+-----+

В Sequel DataSet схож с датасетом из c#, но в отличии от датасета c# завязан с базой данных более тесно
Для фильтрации записей в датасете используется метод filter например:

items.filter('value > 10')
#или
items.filter('value > ?', 10)
#или ещё правильней
items.filter {:value > 10}
Все эти конструкции сгенерируют SQL запрос SELECT * FROM items WHERE value > 10
Продолжение следует