Index

Sequel



# Filter dates
DB[:users].where { created_at > Date.today << 1 }   # 1 month
DB[:users].where { created_at > (Date.today - 10) } # 10 days
# > WHERE created_at (`created_at` > '2016-12-11')

DB[:users].where(created_at: ((Date.today - 10)..(Date.today)))
# Sequel.~ == NOT
# Sequel.& == AND
DB[:users].where { Sequel.~(login: nil, email: nil) }
# WHERE ((`login` IS NOT NULL) OR (`email` IS NOT NULL))

DB[:users].where { Sequel.&(login: nil, email: nil) }
DB[:users].exclude { Sequel.~(login: nil, email: nil) }
# WHERE ((`login` IS NULL) AND (`email` IS NULL))

DB[:users].exclude { Sequel.&(login: nil, email: nil) }
# WHERE NOT ((`login` IS NULL) AND (`email` IS NULL))

DB[:users].exclude { Sequel.&(Sequel.~(login: nil, email: nil)) }
# WHERE NOT ((`login` IS NOT NULL) OR (`email` IS NOT NULL))

DB[:users].where { Sequel.&(Sequel.~(login: nil), Sequel.~(email: nil)) }
# WHERE ((`login` IS NOT NULL) AND (`email` IS NOT NULL))


Name select

DB[:zipcodes]
  .join(:zones, id: :zone_id)
  .join(:countries, id: Sequel[:zipcodes][:country_id])
  .where(:zones__name  => /namur/)
  .select(:zipcodes__name___zipcode_name,
          :zones__name___zone_name,
          :countries__name___country_name)

# SELECT "zipcodes"."name"  AS "zipcode_name",
#        "zones"."name"     AS "zone_name",
#        "countries"."name" AS "country_name"
# FROM   "zipcodes"
#       INNER JOIN "zones"
#               ON ( "zones"."id" = "zipcodes"."zone_id" )
#       INNER JOIN "countries"
#               ON ( "countries"."id" = "zipcodes"."country_id" )
# WHERE  ( "zones"."name" ~ 'namur' )


# REGEX
DB[:users].where(login: /Admin/i)
#  WHERE (`login` REGEXP 'Admin')


Postgres

Postgres' specs (search "@db.create_table!(:items)")

pg_json_ops

DB.extension :pg_array, :pg_json, :pg_json_ops

DB.create_table :movies do
  column :genres, 'text[]'   # Create an Array column
  column :actors, 'jsonb'  # jsonb column
end

DB[:movies].insert(genres: Sequel.pg_array(["Comedy", "Documentary"], :text))
DB[:movies].insert(actors: Sequel.pg_jsonb({"leading" => "Chuck Norris"}))
# Store files in a PG database
DB.alter_table :paintings do
  add_column :painting, File
end

painting_image = File.open("guernica.png").read

DB[:paintings].insert(painting: Sequel.blob(painting_image))

Tools

Copy databases

sequel -C postgres://my_username@localhost/my_pg_db sqlite://my_sqlite_database.sqlite3