35
Работа с базами данных с использованием Sequel

«Работа с базами данных с использованием Sequel»

  • Upload
    -

  • View
    588

  • Download
    6

Embed Size (px)

Citation preview

Page 1: «Работа с базами данных с использованием Sequel»

Работа&с&базами&данныхс"использованием"Sequel

Page 2: «Работа с базами данных с использованием Sequel»
Page 3: «Работа с базами данных с использованием Sequel»

Dependencies

Page 4: «Работа с базами данных с использованием Sequel»
Page 5: «Работа с базами данных с использованием Sequel»

Sequel&has&restored&my&faith&in&Ruby.&It's&really&amazing.&The&O/RM&

I've&been&hoping&for&for&years.—"Sam"Smoot,"creator"of"DataMapper

Page 6: «Работа с базами данных с использованием Sequel»

Database

# memory databaseDB = Sequel.sqlite

# connection stringDB = Sequel.connect('postgres://host/database')

Page 7: «Работа с базами данных с использованием Sequel»

Database

DB.create_table(:users) do primary_key :id String :nameend

Page 8: «Работа с базами данных с использованием Sequel»

Migra&ons

Sequel.migration do change do create_table(:users) do primary_key :id String :name end endend

Page 9: «Работа с базами данных с использованием Sequel»

Dataset

dataset = DB[:users] # SELECT * FROM "table"dataset = DB.from(:users) # SELECT * FROM "table"dataset = DB.select(:column) # SELECT "column"

Page 10: «Работа с базами данных с использованием Sequel»

Dataset

dataset = DB[:test]. select(:first_name, :last_name). where(country: 'BY'). order(:created_at)

Page 11: «Работа с базами данных с использованием Sequel»

Dataset

dataset.firstdataset.alldataset.each { |row| row }

Page 12: «Работа с базами данных с использованием Sequel»

Dataset

dataset.insert(last_name: 'Test')dataset.update(last_name: 'Test')dataset.delete

Page 13: «Работа с базами данных с использованием Sequel»

Virtual(Row(Blocks

dataset.where(Sequel.expr(:a) > Sequel.function(:b, :c))# WHERE a > b(c)

dataset.where { a > b(c) }

Page 14: «Работа с базами данных с использованием Sequel»

Model

class User < Sequel::Model one_to_many :postsend

Page 15: «Работа с базами данных с использованием Sequel»

Model• many_to_one

• one_to_many

• one_to_one

• many_to_many

• one_through_one

Page 16: «Работа с базами данных с использованием Sequel»

Model

class User < Sequel::Model def validate super validates_presence :name endend

Page 17: «Работа с базами данных с использованием Sequel»

Model

class User < Sequel::Model def before_create # do something super end

def after_update super # do something endend

Page 18: «Работа с базами данных с использованием Sequel»

Model

user = User[1234]user.name = 'Test'user.save

Page 19: «Работа с базами данных с использованием Sequel»

Types• pg_array

• pg_hstore

• pg_inet

• pg_interval

• pg_json

• pg_range

Page 20: «Работа с базами данных с использованием Sequel»

pg_array_associa+ons# Database schema:# tags albums# :id (int4) <--\ :id# :name \-- :tag_ids (int4[])# :name

class Album plugin :pg_array_associations pg_array_to_many :tagsend

class Tag plugin :pg_array_associations many_to_pg_array :albumsend

Page 21: «Работа с базами данных с использованием Sequel»

Constraints

create_table(:users) do primary_key :id String :name constraint(:name_min_length) { char_length(name) > 2 }end

Page 22: «Работа с базами данных с использованием Sequel»

Indexesalter_table(:users) do add_index Sequel.function(:lower, :name), name: :lower_nameend

# CREATE INDEX "lower_name" ON "users" (lower("name"))

Page 23: «Работа с базами данных с использованием Sequel»

Func%ons/TriggersDB.create_function(:set_updated_at, <<-SQL, language: :plpgsql, returns: :trigger) BEGIN NEW.updated_at := CURRENT_TIMESTAMP; RETURN NEW; END;SQL

# CREATE FUNCTION set_updated_at() RETURNS trigger LANGUAGE plpgsql AS '# BEGIN# NEW.updated_at := CURRENT_TIMESTAMP;# RETURN NEW;# END;'

DB.drop_function(:set_updated_at)

# DROP FUNCTION set_updated_at()

Page 24: «Работа с базами данных с использованием Sequel»

Func%ons/TriggersDB.create_trigger(:table, :trg_updated_at, :set_updated_at, events: :update, each_row: true, when: { new__updated_at: :old__updated_at })

# CREATE TRIGGER trg_updated_at BEFORE UPDATE ON "table"# FOR EACH ROW WHEN ("new"."updated_at" = "old"."updated_at")# EXECUTE PROCEDURE set_updated_at()

DB.drop_trigger(:table, :trg_updated_at)

# DROP TRIGGER trg_updated_at ON "table"

Page 25: «Работа с базами данных с использованием Sequel»

sequel_postgresql_triggers• pgt_created_at

• pgt_updated_at

• pgt_counter_cache

• pgt_sum_cache

• pgt_immutable

• pgt_touch

Page 26: «Работа с базами данных с использованием Sequel»

Window'Func+ons

SELECT lag(timestamp) OVER (ORDER BY timestamp), timestampFROM events

Page 27: «Работа с базами данных с использованием Sequel»

Window'Func+ons

DB[:events] .select { [lag(timestamp).over(order: :timestamp), timestamp] }

Page 28: «Работа с базами данных с использованием Sequel»

Common%Table%ExpressionsWITH moved_rows AS ( DELETE FROM products WHERE "date" BETWEEN '2010-10-01' AND '2010-10-31' RETURNING *)INSERT INTO products_logSELECT * FROM moved_rows;

DB[:products_log]. with(:moved_rows, DB[:products]. where(date: Date.new(2010, 10, 1)..Date.new(2010, 10, 31)). returning. with_sql(:delete_sql)). insert(DB[:moved_rows])

Page 29: «Работа с базами данных с использованием Sequel»

Recursive)Common)Table)Expressions

Page 30: «Работа с базами данных с использованием Sequel»

rcte_tree• h#p://sequel.jeremyevans.net/rdoc8plugins/classes/Sequel/Plugins/RcteTree.html

• h#p://explainextended.com/2009/09/24/adjacency8list8vs8nested8sets8postgresql/

Page 31: «Работа с базами данных с использованием Sequel»

Prepared'transac,onsDB.transaction(prepare: 'some_transaction_id_string') do # ...end

DB.commit_prepared_transaction('some_transaction_id_string')

DB.rollback_prepared_transaction('some_transaction_id_string')

Page 32: «Работа с базами данных с использованием Sequel»

CursorsDB[:table].use_cursor.each { |row| }

# BEGIN;# DECLARE sequel_cursor NO SCROLL CURSOR WITHOUT HOLD FOR SELECT * FROM "table";# FETCH FORWARD 1000 FROM sequel_cursor# FETCH FORWARD 1000 FROM sequel_cursor# ...# FETCH FORWARD 1000 FROM sequel_cursor# CLOSE sequel_cursor# COMMIT

DB[:table].paged_each { |row| }

Page 33: «Работа с базами данных с использованием Sequel»

Streaming

gem 'sequel_pg'

DB.extension(:pg_streaming)

DB[:table].stream.each { |row| }

DB[:table].paged_each { |row| }

Page 34: «Работа с базами данных с использованием Sequel»

Pluginsh"p://sequel.jeremyevans.net/plugins.html

Page 35: «Работа с базами данных с использованием Sequel»

Documenta*onh"p://sequel.jeremyevans.net/documenta7on.html