Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy...
Transcript of Wykład 6 Marcin Młotkowski 19 listopada 2018marcinm/dyd/ruby/bazydanych.pdfBazy danych DBM Bazy...
Programowanie w RubyWykład 6
Marcin Młotkowski
19 listopada 2018
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
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
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
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
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
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
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
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
Trwałość obiektówBazy danych DBMBazy danych SQLBazy NoSQLActive records
Marshal
Marshal.dumpMarshal.load
Marcin Młotkowski Programowanie w Ruby 169 / 438
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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