Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy...

50
Programowanie w Ruby Wyklad 6 Marcin Mlotkowski 19 listopada 2018

Transcript of Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy...

Page 1: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Programowanie w RubyWykład 6

Marcin Młotkowski

19 listopada 2018

Page 2: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Plan wykładu

1 Trwałość obiektów

2 Bazy danych DBM

3 Bazy danych SQL

4 Bazy NoSQL

5 Active records

Marcin Młotkowski Programowanie w Ruby 164 / 438

Page 3: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Szeregowanie obiektów

Obiekt

@tytul = 'Pan Tadeusz'@autor = 'Adam Mickiewicz'@gatunek = 'epopeja'

0x63 0x6c0x61 0x730x73 0x200x54 0x650x73 0x740x0a 0x200x20 0x400x74 0x79

Postać binarna

Serializacja

Deserializacja

Marcin Młotkowski Programowanie w Ruby 165 / 438

Page 4: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Wybrane formaty zapisu

YAML: YAML Ain’t Markup Language

format niezależny od językaformat: sformatowany tekst

Marshal

format binarnyszybki

Marcin Młotkowski Programowanie w Ruby 166 / 438

Page 5: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Stosowanie

Import odpowiedniego modułu

require ’yaml’

Przykład 1.

str = YAML.dump([1, ’dwa’, 3.0])lista = YAML.load(str)

Przykład 2.

open(plik, ’w’) { | f | YAML.dump(obiekt, f) }obiekt = open(plik, ’r’) { | f | YAML.load(f) }

Marcin Młotkowski Programowanie w Ruby 167 / 438

Page 6: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Stosowanie

Import odpowiedniego modułu

require ’yaml’

Przykład 1.

str = YAML.dump([1, ’dwa’, 3.0])lista = YAML.load(str)

Przykład 2.

open(plik, ’w’) { | f | YAML.dump(obiekt, f) }obiekt = open(plik, ’r’) { | f | YAML.load(f) }

Marcin Młotkowski Programowanie w Ruby 167 / 438

Page 7: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Stosowanie

Import odpowiedniego modułu

require ’yaml’

Przykład 1.

str = YAML.dump([1, ’dwa’, 3.0])lista = YAML.load(str)

Przykład 2.

open(plik, ’w’) { | f | YAML.dump(obiekt, f) }obiekt = open(plik, ’r’) { | f | YAML.load(f) }

Marcin Młotkowski Programowanie w Ruby 167 / 438

Page 8: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Metoda to yaml

[1, ”dwa”, 3.0].to yaml

----1- dwa- 3.0

Marcin Młotkowski Programowanie w Ruby 168 / 438

Page 9: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Metoda to yaml

[1, ”dwa”, 3.0].to yaml

----1- dwa- 3.0

Marcin Młotkowski Programowanie w Ruby 168 / 438

Page 10: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Marshal

Marshal.dumpMarshal.load

Marcin Młotkowski Programowanie w Ruby 169 / 438

Page 11: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Plan wykładu

1 Trwałość obiektów

2 Bazy danych DBM

3 Bazy danych SQL

4 Bazy NoSQL

5 Active records

Marcin Młotkowski Programowanie w Ruby 170 / 438

Page 12: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Co to takiego

DBM: database managerDo przechowywania prostych danychKażda baza danych to po prostu tablica haszującaPrzykład: Berkeley DB

Marcin Młotkowski Programowanie w Ruby 171 / 438

Page 13: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Schemat przetwarzania

Import modułu

require ’dbm’

DBM.open(@dbm name) do | db |db[klucz] = wartoscputs db[klucz]

end

Marcin Młotkowski Programowanie w Ruby 172 / 438

Page 14: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Schemat przetwarzania

Import modułu

require ’dbm’

DBM.open(@dbm name) do | db |db[klucz] = wartoscputs db[klucz]

end

Marcin Młotkowski Programowanie w Ruby 172 / 438

Page 15: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Porada

DBM-y można traktować jak kolekcje

DBM.open(@dbm name) do | db |db.each { |k, v| puts ”#{k} => #{v}”}

end

Marcin Młotkowski Programowanie w Ruby 173 / 438

Page 16: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Porada

DBM-y można traktować jak kolekcje

DBM.open(@dbm name) do | db |db.each { |k, v| puts ”#{k} => #{v}”}

end

Marcin Młotkowski Programowanie w Ruby 173 / 438

Page 17: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Przechowywanie obiektów

class Osobaend

o1 = Osoba.new(...)o2 = Osoba.new(...)o3 = Osoba.new(...)

DBM.open(”telefony.dbm”) do | db |db[’111’] = o1db[’222’] = o2db[’333’] = o3

end

Marcin Młotkowski Programowanie w Ruby 174 / 438

Page 18: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Odczyt danych

DBM.open(”telefony.dbm”) do | db |db.each { | k, v | puts ”#{k} => #{v.to s}” }

end

Marcin Młotkowski Programowanie w Ruby 175 / 438

Page 19: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Plan wykładu

1 Trwałość obiektów

2 Bazy danych DBM

3 Bazy danych SQL

4 Bazy NoSQL

5 Active records

Marcin Młotkowski Programowanie w Ruby 176 / 438

Page 20: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Mechanizm dostępu do bazy danych

DataBase Interface — DBI

definiuje zbiór funkcji i wyjątków jakie powinne byćimplementowane przez moduły do obsługi różnych baz danych

Marcin Młotkowski Programowanie w Ruby 177 / 438

Page 21: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Przykład

Sqlite

Implementuje SQLNie wymaga zewnętrznego serwera (osadzona baza danych)Baza jest pamiętana w jednym plikuImplementuje DBI

Marcin Młotkowski Programowanie w Ruby 178 / 438

Page 22: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Połączenie z serwerem bazy danych

require ’dbi’db = DBI.connect(”DBI:SQLite3:test.db”)

Inny przykład: MySQL

db = DBI.connect(’DBI:Mysql:test:localhost’,’testuser’,”testpass”)

Zamknięcie połączenia

db.disconnect

Marcin Młotkowski Programowanie w Ruby 179 / 438

Page 23: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Połączenie z serwerem bazy danych

require ’dbi’db = DBI.connect(”DBI:SQLite3:test.db”)

Inny przykład: MySQL

db = DBI.connect(’DBI:Mysql:test:localhost’,’testuser’,”testpass”)

Zamknięcie połączenia

db.disconnect

Marcin Młotkowski Programowanie w Ruby 179 / 438

Page 24: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Operacje na otwartej bazie danych

Operacje niezwracające żadnych danychOperacje zwracające listę wierszyOperacje zwracające liczbę

Marcin Młotkowski Programowanie w Ruby 180 / 438

Page 25: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Operacje bez wyniku

Utworzenie nowej tabeli

db.do(”CREATE TABLE Wyklady\( Nr INT NOT NULL,\Tresc VARCHAR(40) )”)

Marcin Młotkowski Programowanie w Ruby 181 / 438

Page 26: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Operacje zwracające liczbę

Wstawienie wiersza do tabeli

row = @db.do(”INSERT INTO Wyklady\(Nr, Tresc) VALUES (#{id}, ’#{t}’)”)puts ””Wstawiono #{row} wierszy do tabeli”

Marcin Młotkowski Programowanie w Ruby 182 / 438

Page 27: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Wyszukiwanie

Przykład 1.

rows = db.execute(”SELECT * FROM Wyklady”)rows.each do | row |

puts ”#{row[0]}, #{row[1]}”endrows.finish

Przykład 2.

rows = db.execute(”SELECT * FROM Wyklady”)rows.each do | row |

puts ”#{row[’Nr’]}, #{row[’Tresc’]}”endrows.finish

Marcin Młotkowski Programowanie w Ruby 183 / 438

Page 28: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Kilka drobnych przykładów

db.select all(”SELECT * FROM Wyklady”) do | row |puts ”#{row[0]}, #{row[1]}”

end

db.select one(”SELECT ... WHERE NR=1”)

Marcin Młotkowski Programowanie w Ruby 184 / 438

Page 29: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Plan wykładu

1 Trwałość obiektów

2 Bazy danych DBM

3 Bazy danych SQL

4 Bazy NoSQL

5 Active records

Marcin Młotkowski Programowanie w Ruby 185 / 438

Page 30: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Bazy NoSQL

Bazy danych oparte na modelowaniu danych inne niż relacyjne.

Rodzaje

obiektowezorientowane na dokumentyklucz–wartośćgrafowe

Marcin Młotkowski Programowanie w Ruby 186 / 438

Page 31: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Bazy NoSQL

Bazy danych oparte na modelowaniu danych inne niż relacyjne.

Rodzaje

obiektowezorientowane na dokumentyklucz–wartośćgrafowe

Marcin Młotkowski Programowanie w Ruby 186 / 438

Page 32: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

MongoDB

Baza danych zorientowana na dokumenty (JSON).

Dokumenty są zgromadzone w kolekcje.

Marcin Młotkowski Programowanie w Ruby 187 / 438

Page 33: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

MongoDB

Baza danych zorientowana na dokumenty (JSON).Dokumenty są zgromadzone w kolekcje.

Marcin Młotkowski Programowanie w Ruby 187 / 438

Page 34: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Otwarcie i zamknięcie z MongoDB

Otwarcie

require ’mongo’Mongo::Logger.logger.level = ::Logger::FATAL

client = Mongo::Client.new([ ’127.0.0.1:27017’ ], :database =>’testdb’)

Zamknięcie

client.close

Marcin Młotkowski Programowanie w Ruby 188 / 438

Page 35: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Utworzenie kolekcji

Mongo::Collection.new(client, ’kraje’)

Marcin Młotkowski Programowanie w Ruby 189 / 438

Page 36: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Dodanie elementów

client[:kraje].insert one {: id => BSON::ObjectId.new,:nazwa => ’Malta’,:powierzchnia => 26

}

client[:kraje].insert one {: id => BSON::ObjectId.new,:nazwa => ’Tuvalu’,:powierzchnia => 316

}

Marcin Młotkowski Programowanie w Ruby 190 / 438

Page 37: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Odczyt

client[:kraje].find.each { | kraj | puts kraj }

client[:kraje].find(”powierzchnia” => { ’$lt’ => 150 }).each do | kraj |puts kraj

end

Marcin Młotkowski Programowanie w Ruby 191 / 438

Page 38: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Odczyt

client[:kraje].find.each { | kraj | puts kraj }

client[:kraje].find(”powierzchnia” => { ’$lt’ => 150 }).each do | kraj |puts kraj

end

Marcin Młotkowski Programowanie w Ruby 191 / 438

Page 39: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Plan wykładu

1 Trwałość obiektów

2 Bazy danych DBM

3 Bazy danych SQL

4 Bazy NoSQL

5 Active records

Marcin Młotkowski Programowanie w Ruby 192 / 438

Page 40: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Dygresja: symbole

Symbol

identyfikator odpowiadający łańcuchowi znaków

Tworzenie identyfikatorów

:obiekt:’obiekt’

Marcin Młotkowski Programowanie w Ruby 193 / 438

Page 41: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Odwzorowania obiektowo-relacyjne

class Student@imie@nazw...

end

CREATE TABLE stud (imie VARCHAR(30),nazw VARCHAR(40),...);

Marcin Młotkowski Programowanie w Ruby 194 / 438

Page 42: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Zarządzanie odwzorowaniem O-R w Rubym

ActiveRecord

Zapewnia automatyczne odwzorowanie między obiektami abazą danychUkrywa wykorzystanie SQLImplementuje związki między tabelamiWymaga przestrzegania wielu konwencji

Marcin Młotkowski Programowanie w Ruby 195 / 438

Page 43: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Użycie ActiveRecord

Zadanie

Zaprogramować bazę danych zawierającą dane o

studentachzadaniach oddanych przez studentów

Marcin Młotkowski Programowanie w Ruby 196 / 438

Page 44: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Rozwiązanie w SQL

Deklaracja tabeli studs

’CREATE TABLE studs (id INT(11) NOT NULL AUTO_INCREMENT,index VARCHAR (20),punkty INT,PRIMARY KEY(id))’

Deklaracja tabeli studs

’CREATE TABLE stud_exercises (id INT NOT NULL AUTO_INCREMENT,stud_id INT(11),zad INT,tresc TEXT,PRIMARY KEY(id))’

Marcin Młotkowski Programowanie w Ruby 197 / 438

Page 45: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Rozwiązanie obiektowe

Deklaracja klas

require ’activerecord’

class Stud < ActiveRecord::Basehas many :stud exercises

end

class StudExercise < ActiveRecord::Basebelongs to :stud

end

Marcin Młotkowski Programowanie w Ruby 198 / 438

Page 46: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Active record

Klasa tabelaObiekt wiersz tabeli

Pole obiektu kolumna

Marcin Młotkowski Programowanie w Ruby 199 / 438

Page 47: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Konwencje

class stud CREATE TABLE studsclass StudExercise CREATE TABLE stud exercise

Marcin Młotkowski Programowanie w Ruby 200 / 438

Page 48: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Tworzenie obiektów

madry = Stud.create(:index => ’10011101’, :punkty => 0)

zadanie = StudExercise.create(:stud int => madry,:zad => 2, tresc => ’puts 0’)

Marcin Młotkowski Programowanie w Ruby 201 / 438

Page 49: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Odwołania do elementów bazy danych

Pobieranie danych

studs = Stud.find (:all,:conditions => ”index > ’100011’ ”,:order => ’index DESC’)

Modyfikacja danych

studs.each do |s|s.punkty = s.punkty + 10s.save

end

Marcin Młotkowski Programowanie w Ruby 202 / 438

Page 50: Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy danych SQL Bazy NoSQL Active records Wyszukiwanie Przykład 1. rows = db.execute(”SELECT

Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records

Odwołania do elementów bazy danych

Pobieranie danych

studs = Stud.find (:all,:conditions => ”index > ’100011’ ”,:order => ’index DESC’)

Modyfikacja danych

studs.each do |s|s.punkty = s.punkty + 10s.save

end

Marcin Młotkowski Programowanie w Ruby 202 / 438