SlideShare a Scribd company logo
1 of 17
Sequel
механизм доступа к БД, написанный на Ruby

         Piter.rb #3, март 2011
                           Алексей Найден
                             EvilMartians.ru
Примеры

• Выполнение простых операций над
  большими объемами данных:
 • Биллинг
 • Отчеты
• Работа с legacy БД
ORM vs. Recordset
•   ORM (O/RM) — Object-Relational Mapping.
    Отображение реляций БД на ООП-сущности
    (классы, объекты, методы). Фактически
    создается виртуальная объектная БД
    users.first.login

•   Recordset — доступ к результату запроса
    через хеш, массив или их комбинацию
    db[‘users’][0][‘login’]
Object Query vs. Raw SQL

• Object Query — генерация
  запроса к БД, посредством вызова
  методов
  User.find(:all, :conditions => {:active => true})

• Raw SQL — использование
  чистого SQL для доступа к БД
  User.find_by_sql(‘select * from users’)
Основная дилемма


• Скорость + Гибкость
• Простота + Универсальность
Пример из реального мира
     SELECT fc.fieldvalue AS category, fs.fieldvalue AS ticket_type, u.fullname as username,
t.isphonecall AS phone, t.isemailed AS email, coalesce((CASE WHEN fp.fieldvalue IS NULL OR
t.isphonecall = 1 THEN 0 ELSE 1 END), 0) AS web, l.actionmsg AS action_text, t.ticketid as
ticket_id
     FROM swtickets t
     LEFT JOIN swcustomfieldvalues fc
     
ON fc.typeid = t.ticketid AND fc.customfieldid = 23
     LEFT JOIN swcustomfieldvalues fs
        ON fs.typeid = t.ticketid AND fs.customfieldid = 24
     INNER JOIN swusers u ON u.userid = t.userid
     LEFT JOIN swauditlogs l
     
ON l.ticketid = t.ticketid
     

    AND l.second_line = 1
     LEFT JOIN swcustomfieldvalues fp
     
ON fp.typeid = t.ticketid AND fp.customfieldid = 26
     WHERE t.ticketstatusid IN ? AND FROM_UNIXTIME(t.lastactivity) BETWEEN
DATE(?) AND DATE(?)
     ORDER BY t.ticketid, l.dateline DESC
Реализация с помощью
     ActiveRecord
Swticket.find(:all, :select => ‘fc.fieldvalue AS category, fs.fieldvalue AS ticket_type, u.fullname as
username, t.isphonecall AS phone, t.isemailed AS email, coalesce((CASE WHEN fp.fieldvalue IS
NULL OR t.isphonecall = 1 THEN 0 ELSE 1 END), 0) AS web, l.actionmsg AS action_text,
t.ticketid as ticket_id’,
:joins =>
[‘LEFT JOIN swcustomfieldvalues fc ON fc.typeid = t.ticketid AND fc.customfieldid = 23’,
‘LEFT JOIN swcustomfieldvalues fs ON fs.typeid = t.ticketid AND fs.customfieldid = 24’,
‘INNER JOIN swusers u ON u.userid = t.userid’,
‘LEFT JOIN swauditlogs l ON l.ticketid = t.ticketid AND l.second_line = 1’,
‘LEFT JOIN swcustomfieldvalues fp ON fp.typeid = t.ticketid AND fp.customfieldid = 26’],
:conditions =>
[
‘t.ticketstatusid IN ? AND from_unixtime(t.lastactivity) BETWEEN DATE(?) AND DATE(?)’,
25, 3.days.ago, Date.today
],
:order => ‘t.ticketid, l.dateline DESC’)
Gem Sequel

• http://sequel.rubyforge.org/
• gem install sequel
• require ‘rubygems’ # Чистый Ruby
  require ‘sequel’
• gem ‘sequel’ # Gemfile (Rails)
Возможности
•   RecordSet / ORM

•   Raw SQL / Object Query

•   Thread-safe, connection pooling

•   Работает с ADO, JDBC, MySQL, ODBC, Oracle,
    PostgreSQL, SQLite3 и еще десятью СУБД

•   Поддерживает prepared statements, хранимые
    процедуры, сейвпоинты, master/slave, шардинг
Работа с Sequel
Dataset I
•   chanmems = DB[:mems].filter(:source => '4chan.org')
    chanmems.avg(:uses)
    SELECT avg(uses) FROM mems WHERE source = '4chan.org'

•   chanmems.map(:name) #=> ['Trollface', 'FFFFUUU', 'Pedobear', ...]
    chanmems.to_hash(:name, :author) #=> {'Trollface' =>
    ‘Anonymous’, 'FfFFUUU' => ‘Anonymous’, ...}

•   dataset = DB['select id from mems']
    dataset.count #=> 31337

•   DB['select * from items where name = ?', name].each do |row|
      p row
    end
Dataset II
•   my_posts = posts.filter(:category => 'ruby', :author => 'david')
    my_posts = posts.filter(:stamp => (Date.today - 9)..(Date.today - 2))
    my_posts = posts.filter(:category => ['ruby', 'postgres', 'linux'])

•   my_posts = posts.exclude(:category => ['ruby', 'postgres', 'linux'])

•   posts.filter('stamp IS NOT NULL')

•   posts.filter('stamp < ?', Date.today - 3).delete
    # DELETE FROM posts WHERE stamp < '2010-07-11'

•   posts.insert(:category => 'ruby', :author => 'david')
    # INSERT INTO posts (category, author) VALUES ('ruby', 'david')

•   Параметры для where, подзапросы, агрегация, chaining, транзакции,
    join по произвольным колонкам
Модели
•   class Post < Sequel::Model

•   post = Post[123]
    post = Post[:title => ‘Hello’]

•   post.title #=> ‘Hello’
    post[:title] #=> ‘Hello’

•   many_to_one :author
    one_to_many :comments
    many_to_many :tags
•   subset(:posts_with_few_comments){num_comments < 30}
•   Валидация, callbacks, бизнес-логика для датасета, STI, миграции, timestamps
    и т.д.
Чистый SQL

•   DB.fetch("SELECT * FROM albums WHERE name LIKE :pattern", :pattern=>'A%') do |row|
      puts row[:name]
    end

•   DB["UPDATE albums SET name = ? WHERE name = ?", 'MO', 'RF'].update

•   DB.run "CREATE TABLE albums (id integer primary key, name varchar(255))"

•   DB << "ALTER TABLE albums ADD COLUMN copies_sold INTEGER"

•   DB[:albums].select{function(col1, col2)} # SELECT function("col1", "col2") FROM "albums"
Сравнение с
        DataMapper

• DataMapper — только ORM
• Даже в ORM другая философия: DM
  модель > БД, Sequel БД > модель
• В Sequel больше back-ends из коробки
Производительность
Вопросы?

• alexey.nayden@gmail.com

• twitter.com/alexnayden

• http://evilmartians.ru

More Related Content

What's hot

Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Andrey Sitnik
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»
Yandex
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Yulia Tsisyk
 

What's hot (19)

How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
PowerShell
PowerShellPowerShell
PowerShell
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
Chef
ChefChef
Chef
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
 
WordPress auto-install: просто о сложном
WordPress auto-install: просто о сложномWordPress auto-install: просто о сложном
WordPress auto-install: просто о сложном
 
Perl – жив?!
Perl – жив?!Perl – жив?!
Perl – жив?!
 
Event Machine
Event MachineEvent Machine
Event Machine
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
 
Python infrastructure from scratch
Python infrastructure from scratchPython infrastructure from scratch
Python infrastructure from scratch
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
 

Similar to Sequel — механизм доступа к БД, написанный на Ruby

CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
Ontico
 
MySQL+HandlerSocket=NoSQL
MySQL+HandlerSocket=NoSQL MySQL+HandlerSocket=NoSQL
MySQL+HandlerSocket=NoSQL
Sergey Xek
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
pgdayrussia
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Sergey Xek
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Yandex
 

Similar to Sequel — механизм доступа к БД, написанный на Ruby (20)

Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
 
MySQL+HandlerSocket=NoSQL
MySQL+HandlerSocket=NoSQL MySQL+HandlerSocket=NoSQL
MySQL+HandlerSocket=NoSQL
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 

Recently uploaded

Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 

Recently uploaded (9)

Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 

Sequel — механизм доступа к БД, написанный на Ruby

  • 1. Sequel механизм доступа к БД, написанный на Ruby Piter.rb #3, март 2011 Алексей Найден EvilMartians.ru
  • 2. Примеры • Выполнение простых операций над большими объемами данных: • Биллинг • Отчеты • Работа с legacy БД
  • 3. ORM vs. Recordset • ORM (O/RM) — Object-Relational Mapping. Отображение реляций БД на ООП-сущности (классы, объекты, методы). Фактически создается виртуальная объектная БД users.first.login • Recordset — доступ к результату запроса через хеш, массив или их комбинацию db[‘users’][0][‘login’]
  • 4. Object Query vs. Raw SQL • Object Query — генерация запроса к БД, посредством вызова методов User.find(:all, :conditions => {:active => true}) • Raw SQL — использование чистого SQL для доступа к БД User.find_by_sql(‘select * from users’)
  • 5. Основная дилемма • Скорость + Гибкость • Простота + Универсальность
  • 6. Пример из реального мира SELECT fc.fieldvalue AS category, fs.fieldvalue AS ticket_type, u.fullname as username, t.isphonecall AS phone, t.isemailed AS email, coalesce((CASE WHEN fp.fieldvalue IS NULL OR t.isphonecall = 1 THEN 0 ELSE 1 END), 0) AS web, l.actionmsg AS action_text, t.ticketid as ticket_id FROM swtickets t LEFT JOIN swcustomfieldvalues fc ON fc.typeid = t.ticketid AND fc.customfieldid = 23 LEFT JOIN swcustomfieldvalues fs ON fs.typeid = t.ticketid AND fs.customfieldid = 24 INNER JOIN swusers u ON u.userid = t.userid LEFT JOIN swauditlogs l ON l.ticketid = t.ticketid AND l.second_line = 1 LEFT JOIN swcustomfieldvalues fp ON fp.typeid = t.ticketid AND fp.customfieldid = 26 WHERE t.ticketstatusid IN ? AND FROM_UNIXTIME(t.lastactivity) BETWEEN DATE(?) AND DATE(?) ORDER BY t.ticketid, l.dateline DESC
  • 7. Реализация с помощью ActiveRecord Swticket.find(:all, :select => ‘fc.fieldvalue AS category, fs.fieldvalue AS ticket_type, u.fullname as username, t.isphonecall AS phone, t.isemailed AS email, coalesce((CASE WHEN fp.fieldvalue IS NULL OR t.isphonecall = 1 THEN 0 ELSE 1 END), 0) AS web, l.actionmsg AS action_text, t.ticketid as ticket_id’, :joins => [‘LEFT JOIN swcustomfieldvalues fc ON fc.typeid = t.ticketid AND fc.customfieldid = 23’, ‘LEFT JOIN swcustomfieldvalues fs ON fs.typeid = t.ticketid AND fs.customfieldid = 24’, ‘INNER JOIN swusers u ON u.userid = t.userid’, ‘LEFT JOIN swauditlogs l ON l.ticketid = t.ticketid AND l.second_line = 1’, ‘LEFT JOIN swcustomfieldvalues fp ON fp.typeid = t.ticketid AND fp.customfieldid = 26’], :conditions => [ ‘t.ticketstatusid IN ? AND from_unixtime(t.lastactivity) BETWEEN DATE(?) AND DATE(?)’, 25, 3.days.ago, Date.today ], :order => ‘t.ticketid, l.dateline DESC’)
  • 8. Gem Sequel • http://sequel.rubyforge.org/ • gem install sequel • require ‘rubygems’ # Чистый Ruby require ‘sequel’ • gem ‘sequel’ # Gemfile (Rails)
  • 9. Возможности • RecordSet / ORM • Raw SQL / Object Query • Thread-safe, connection pooling • Работает с ADO, JDBC, MySQL, ODBC, Oracle, PostgreSQL, SQLite3 и еще десятью СУБД • Поддерживает prepared statements, хранимые процедуры, сейвпоинты, master/slave, шардинг
  • 11. Dataset I • chanmems = DB[:mems].filter(:source => '4chan.org') chanmems.avg(:uses) SELECT avg(uses) FROM mems WHERE source = '4chan.org' • chanmems.map(:name) #=> ['Trollface', 'FFFFUUU', 'Pedobear', ...] chanmems.to_hash(:name, :author) #=> {'Trollface' => ‘Anonymous’, 'FfFFUUU' => ‘Anonymous’, ...} • dataset = DB['select id from mems'] dataset.count #=> 31337 • DB['select * from items where name = ?', name].each do |row| p row end
  • 12. Dataset II • my_posts = posts.filter(:category => 'ruby', :author => 'david') my_posts = posts.filter(:stamp => (Date.today - 9)..(Date.today - 2)) my_posts = posts.filter(:category => ['ruby', 'postgres', 'linux']) • my_posts = posts.exclude(:category => ['ruby', 'postgres', 'linux']) • posts.filter('stamp IS NOT NULL') • posts.filter('stamp < ?', Date.today - 3).delete # DELETE FROM posts WHERE stamp < '2010-07-11' • posts.insert(:category => 'ruby', :author => 'david') # INSERT INTO posts (category, author) VALUES ('ruby', 'david') • Параметры для where, подзапросы, агрегация, chaining, транзакции, join по произвольным колонкам
  • 13. Модели • class Post < Sequel::Model • post = Post[123] post = Post[:title => ‘Hello’] • post.title #=> ‘Hello’ post[:title] #=> ‘Hello’ • many_to_one :author one_to_many :comments many_to_many :tags • subset(:posts_with_few_comments){num_comments < 30} • Валидация, callbacks, бизнес-логика для датасета, STI, миграции, timestamps и т.д.
  • 14. Чистый SQL • DB.fetch("SELECT * FROM albums WHERE name LIKE :pattern", :pattern=>'A%') do |row| puts row[:name] end • DB["UPDATE albums SET name = ? WHERE name = ?", 'MO', 'RF'].update • DB.run "CREATE TABLE albums (id integer primary key, name varchar(255))" • DB << "ALTER TABLE albums ADD COLUMN copies_sold INTEGER" • DB[:albums].select{function(col1, col2)} # SELECT function("col1", "col2") FROM "albums"
  • 15. Сравнение с DataMapper • DataMapper — только ORM • Даже в ORM другая философия: DM модель > БД, Sequel БД > модель • В Sequel больше back-ends из коробки

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n