Fernando Blat
             @ferblape
Tuesday, April 12, 2011
Un poco sobre mí

       •       De Valencia            • unvlog.com
       • 4 años en The Cocktail y     • iwannagothere.com //
               La Coctelera             mimaleta.com

       •       He sido freelance un   • lacoctelera.com //
               tiempo                   partigi.com

       • Ahora trabajo en             • actuable.es
               Vizzuality

Tuesday, April 12, 2011
Sequel!



Tuesday, April 12, 2011
Dataset



Tuesday, April 12, 2011
Representación de un
                 conjunto de filas de una
                      o varias tablas


Tuesday, April 12, 2011
users                              updates
              -           id            -   id
              -           username      -   user_id
              -           email         -   message
              -           created_at    -   created_at




Tuesday, April 12, 2011
DB = Sequel.connect('sqlite://
      ddbb.sqlite3')

      DB.class
      => Sequel::Postgres::Database




Tuesday, April 12, 2011
users = DB[:users]
         => #<Sequel::SQLite::Dataset:
         "SELECT * FROM `users`">




Tuesday, April 12, 2011
users.filter("email = ?", 'ferblape@gmail.com')

   => #<Sequel::SQLite::Dataset: "SELECT * FROM
   `users` WHERE (email = 'ferblape@gmail.com')">




Tuesday, April 12, 2011
users.filter("email = ?", 'ferblape@gmail.com').sql

  => "SELECT * FROM `users` WHERE (email =
  'ferblape@gmail.com')




Tuesday, April 12, 2011
Un Dataset es una
                           representación


Tuesday, April 12, 2011
#first, #last,
                             #count,
                            #all, ...


Tuesday, April 12, 2011
Algunas consultas con
                                 Sequel


Tuesday, April 12, 2011
users[1]

                 users[:username => 'blat']




Tuesday, April 12, 2011
users.filter({:email =>
  ['ferblape@gmail.com','ferblape@vizzuality.co
  m']}).sql

  => "SELECT * FROM `users` WHERE (`email` IN
  ('ferblape@gmail.com',
  'ferblape@vizzuality.com'))"




Tuesday, April 12, 2011
users.filter({:email =>
 ['ferblape@gmail.com','ferblape@vizzuality.co
 m']} & ~{:username => 'blat'}).sql

 => "SELECT * FROM `users` WHERE ((`email` IN
 ('ferblape@gmail.com',
 'ferblape@vizzuality.com')) AND (`username` !
 = 'blat'))"




Tuesday, April 12, 2011
users.filter{created_at > Date.today}.or
   {created_at < Date.today - 60}.order
   (:id).limit(10).sql

   => "SELECT * FROM `users` WHERE
   ((`created_at` > '2011-03-26') OR
   (`created_at` < '2011-01-25')) ORDER BY `id`
   LIMIT 10"




Tuesday, April 12, 2011
Inserciones



Tuesday, April 12, 2011
users.insert(:username => 'blat', :email =>
    'ferblape@gmail.com')
    => 1

    users.insert(:username => 'blatvizz', :email
    => 'ferblape@vizzuality.com')
    => 2




Tuesday, April 12, 2011
Actualizaciones



Tuesday, April 12, 2011
users.update(:id => :id + 1000)
        => 2

        users.all
        =>
        [{:id=>1001, :username=>"blat",
        :email=>"ferblape@gmail.com",
        :created_at=>2011-03-26 00:00:00 +0100},
        {:id=>1002, :username=>"blatvizz",
        :email=>"ferblape@vizzuality.com",
        :created_at=>2011-03-26 00:00:00 +0100}]



Tuesday, April 12, 2011
Resultados de las
                             consultas


Tuesday, April 12, 2011
users.all

       =>
       [{:id=>1, :username=>"blat",
       :email=>"ferblape@gmail.com",
       :created_at=>nil},
       {:id=>2, :username=>"blatvizz",
       :email=>"ferblape@vizzuality.com",
       :created_at=>nil}]




Tuesday, April 12, 2011
users.to_hash(:id,:username)

                 => {1=>"blat", 2=>"blatvizz"}




Tuesday, April 12, 2011
users.select_map(:username)

                 => ["blat", "blatvizz"]




Tuesday, April 12, 2011
Algunos ejemplos más
                           esotéricos


Tuesday, April 12, 2011
users.group_and_count(:id).sql

                 => "SELECT `id`, count(*) AS 'count'
                 FROM `users` GROUP BY `id`"




Tuesday, April 12, 2011
updates.join(users.filter{created_at <
   Date.today}, :id => :user_id).sql

   => "SELECT * FROM `updates` INNER JOIN
   (SELECT * FROM `users` WHERE (`created_at` <
   '2011-03-26')) AS 't1' ON (`t1`.`id` =
   `updates`.`user_id`)"




Tuesday, April 12, 2011
users.select(:username___wadus).sql

                 => "SELECT `username` AS 'wadus' FROM
                 `users`"




Tuesday, April 12, 2011
Modelos



Tuesday, April 12, 2011
Tuesday, April 12, 2011
class Table < Sequel::Model(:user_tables)

                 # Ignore mass-asigment on not allowed columns
                 self.strict_param_setting = false

                 # Allowed columns
                 set_allowed_columns(:name, :privacy, :tags)

                 def before_validation
                   self.privacy ||= :public
                   self.name = set_table_name if self.name.blank?
                   super
                 end

                 ...

            end




Tuesday, April 12, 2011
Más



Tuesday, April 12, 2011
• migraciones estilo             • zonas horarias
               ActiveRecord
                                        • relaciones
       • gestión de múltiples           • dirty attributes
               bbdd: maestro-esclavo,
               maestro-maestro          • serialización JSON
       • sharding de tablas             • compatibilidad con
                                          ActiveModel
       • transacciones
       • paginación                     • extensiones y plugins

Tuesday, April 12, 2011
Tuesday, April 12, 2011
¿Vale la pena utilizarlo
                                 con Rails?


Tuesday, April 12, 2011
Acoplamiento

                     • tareas Rake
                     • migraciones
                     • generadores
                     • config/database.yml

Tuesday, April 12, 2011
sequel-rails



Tuesday, April 12, 2011
Gracias!




Tuesday, April 12, 2011

Sequel @ madrid-rb