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).