1. Kontynuacja poprzednich zajęć Loginy i hasła do

advertisement
Projektowanie aplikacji internetowych
(zajęcia 24.04.2017 r.)
1. Kontynuacja poprzednich zajęć
Loginy i hasła do indywidualnych baz danych dostępnych na serwerze uniwersyteckim o
adresie ip: ​172.16.24.12​ dostępne są w dokumencie​:
​http://koza.if.uj.edu.pl/~marcin/PAI1617/M/db2017-gr2.txt
2. Wprowadzenie do ORM (Mapowanie obiektowo-relacyjne)
Mapowanie obiektowo-relacyjne (ORM) ma na celu usystematyzowanie i ułatwienie komunikacji
pomiędzy aplikacją, a bazą danych, w zasadzie eliminując konieczność stosowania języka
zapytań np. SQL.
W środowisku uruchomieniowym Node.js, pakietem służącym jako interfejs ORM jest Sequelize
(http://docs.sequelizejs.com/ ). Pakiet ten jest bogatym zbiorem metod umożliwiających:
- stworzenie modelu danych,
- nawiązanie połączenia z bazą danych,
- wykonywanie zapytań i agregację danych.
a.) Instalacja w wybranym projekcie Express.js oraz nawiązanie połączenia:
npm install sequelize --save
Konieczne jest zainstalowanie również interfejstu który odpowiada z komunikację z danym
typem bazy danych. Dla przykładu gdy korzystamy z bazy MySQL konieczne jest
zainstalowanie modułu:
npm install mysql --save
Rozważmy przykład w którym tworzymy bazę danych o następującej fizycznej strukturze:
Na początek należy utworzyć połączenie bazodanowe definiując jego parametry:
var Sequelize = require('sequelize');
var sequelize =
new Sequelize('nazwa_bazy_danych','nazwa_uzytkownika','haslo', {
host: 'localhost', // nazwa hosta
port: 3306 // numer portu
} );
b.) Stworzenie modelu danych:
W kolejnym kroku musimy przełożyć fizyczność bazy na model danych który ma
odwzorowywać jej fizyczną strukturę czyli relacje połączone związkami. Pierwszym krokiem w
tworzeniu modelu jest zadeklarowanie wszystkich relacji używając metody ​.define():
var Projekt = sequelize.define('Projekt',{
tytul: Sequelize.STRING,
opis: Sequelize.TEXT,
data: Sequelize.DATE
});
gdzie pierwszy parametr metody oznacza nazwę relacji (tabeli), a drugi stanowi obiekt
własności relacji z zadeklarowanym typem (patrz strona:
http://docs.sequelizejs.com/en/latest/docs/models-definition/​)
Zadeklarujemy drugi obiekt:
var Zadanie = sequelize.define('Zadanie',{
tytul: Sequelize.STRING,
stat: Sequelize.STRING
});
Następnie musimy zadeklarować związki pomiędzy relacjami używając: metod:
.belongsTo()​,
hasMany():
Zadanie.belongsTo(Projekt);
Projekt.hasMany(Zadanie);
Metody służące do definiowania zależności pomiędzy relacjami to:
hasOne​- dodaje klucz obcy do tabeli docelowej i zależność typu 1:1
belongsTo​- dodaje klucz obcy do tabeli źródłowej i zależność typu 1:1
hasMany​- dodaje klucz obcy do tabeli docelowej i zależność typu 1:N (wielu)
belongsToMany​- tworzy zależność N:M (wiele-do-wielu)
c.) Nawiązanie połączenia z bazą i jej synchronizacja:
Dzięki ORM nie musimy “ręcznie” implementować struktury bazy danych, ponieważ
Sequelize przy pierwszym połączeniu sam zrobi to za nas używając informacji z modelu:
sequelize.sync();
d.) Wykonywanie zapytań i ich wyświetlanie.
Do odpytywania bazy danych o dane ich dodawanie i usuwanie jest wykonywane za pomocą
zestawu funkcji. Przykładowo gdy chcemy zapytać bazę danych o wszystkie dosßepne projekty
przechowywane w bazie (zgodnie z stworzonym modelem) musimy wywołać metodę: .findAll():
Projekt.findAll()
.then(function(projekty){
res.render('index', { title: 'Przykład ORM', data: projekty });
})
.error(0);
W wyniku działania tej metody zostanie zwrócony obiekt projekty, który jest tablicą [0...n] (w
zależności od liczby rezultatów), który zawiera dane w obiekcie “dataValues” o polach zgodnych
ze stworzonym modelem. Zatem obsługa zwracanego obiektu z bazy danych za powyższego
zapytania i przekazanie go do widoku musi zostać w widoku obsłużone w nastęþujący sposób:
div
each item in data
span #{item.dataValues.tytul} |
#{item.dataValues.data}
Br
#{item.dataValues.opis} |
Większa ilość przykładów zapytań dostępna jest w wykładzie 8.
ZADANIE:
Proszę przygotować aplikacje w środowisku Express, w której będzie model danych złożony z
dwóch relacji (tak jak w przykładzie powyżej) i będzie obsługiwany za pomocą mapowania
obiektowo-relacyjnego ORM za pomocą pakietu Sequelize. Następnie proszę przygotować
endpoint służące do: wyświetlające danych ze stworzonej bazy danych oraz endpointa dzięku
któremu będziemy bazę mogli zasilić (INSERT).
Download