Збереження і видобування даних

Содержание

Слайд 2

Вступ Сьогодні ми поговоримо про збереження даних Які способи збереження даних ви знаєте?

Вступ

Сьогодні ми поговоримо про збереження даних
Які способи збереження даних ви знаєте?

Слайд 3

Вступ В Google App Engine є багато варіантів збереження даних, наприклад:

Вступ

В Google App Engine є багато варіантів збереження даних, наприклад:
Cloud SQL
Cloud

Storage
Cloud Datastore
Ми розберемося з Datastore
Слайд 4

Datastore Datastore – це база даних, що працює в Google Cloud

Datastore

Datastore – це база даних, що працює в Google Cloud
Вона доступна

для будь-якого App Engine застосування
Це Big Table
Докладніше про Big Table http://research.google.com/archive/bigtable.html
Це сховище виду key-value (дуже схоже на HashTable)
Також вона column-oriented (колонки, а не рядки зберігаються разом)
Це не реляційна база даних
Слайд 5

Datastore Що ж нам дає Datastore? можливість будувати масштабовані застосування можливість

Datastore

Що ж нам дає Datastore?
можливість будувати масштабовані застосування
можливість працювати з грандіозними

масивами даних
реплікацію
Слайд 6

Збереження даних З чим ви працювали і наведіть приклади: local filesystem

Збереження даних

З чим ви працювали і наведіть приклади:
local filesystem
shared filesystem
cloud file

storage
relational databases
NoSQL databases
Google App Engine Datastore
Слайд 7

Datastore Коли ми працюємо з Google Datastore ми маємо використовувати наступні

Datastore

Коли ми працюємо з Google Datastore ми маємо використовувати наступні абстракції:
kind
дуже

схоже на концепт клас з ООП
це загальний вид сутностей
entity
конкретний запис в kind
property
властивості якими володіють entity
Слайд 8

Datastore

Datastore

Слайд 9

Datastore Відмінностей дуже багато, але спочатку можете уявляти саме так

Datastore

Відмінностей дуже багато, але спочатку можете уявляти саме так

Слайд 10

Datastore Давайте спробуємо розібратися як зберігати об’єкти в Datastore Для цього

Datastore

Давайте спробуємо розібратися як зберігати об’єкти в Datastore
Для цього ми розберемося

з
Objectify
Entity
unique id
admin console
видобування entity з Datastore
Слайд 11

Entity import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Id; @Entity public class Student{ @Id Long

Entity

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
@Entity
public class Student{
@Id Long studentId;
String name;
Integer course
//getters and setters
}
Більш

докладно про Entity
https://cloud.google.com/appengine/docs/java/datastore/entities
Більш докладно про Objectify
https://code.google.com/p/objectify-appengine/wiki/Concepts
Слайд 12

Property types Як ви думаєте, що відбувається з вашим об’єктом на

Property types

Як ви думаєте, що відбувається з вашим об’єктом на етапі

збереження його в Datastore?
Що відбувається з його полями?
Слайд 13

Property types Основні типи, що підтримуються: integers floating-point numbers strings dates

Property types

Основні типи, що підтримуються:
integers
floating-point numbers
strings
dates
binary data
Але типів набагато більше
https://cloud.google.com/appengine/docs/java/datastore/entities#Java_Properties_and_value_types

Слайд 14

Збереження Давайте повернемося до нашого проекту з конференціями В нас був

Збереження

Давайте повернемося до нашого проекту з конференціями
В нас був профайл користувача,

тепер ми хочемо зберігати його в datastore
Що ми маємо зробити спочатку?
Слайд 15

Збереження @Entity public class Profile { String displayName; String mainEmail; TeeShirtSize

Збереження

@Entity
public class Profile {
String displayName;
String mainEmail;
TeeShirtSize teeShirtSize;
@Id String userId;

}

Слайд 16

Datastore Keys Коли ви зберігаєте Entity в datastore, вона отримує у

Datastore Keys

Коли ви зберігаєте Entity в datastore, вона отримує у відповідність

ключ
Ключ генерується datastore
Цей ключ унікально ідентифікує Entity
Існує два способи отримати ключ від datastore
Слайд 17

Datastore Keys Перший: В нас є проста Entity Student name course

Datastore Keys

Перший:
В нас є проста Entity
Student
name
course
коли ми будемо зберігати дану

сутність, datastore поверне нам ключ
Слайд 18

Datastore Keys Другий В нас є Entity в якої визначене унікальне

Datastore Keys

Другий
В нас є Entity в якої визначене унікальне поле
Student
id
name
course
коли ми

будемо зберігати дану сутність, datastore поверне нам ключ, що буде згенерований на основі даного унікального поля
Перевага даного підходу полягає в тому, що ви можете забрати сутність з бази за цим полем id, а в першому випадку в вас немає такого поля і потрібно використовувати додаткові механізми
primary key
Слайд 19

Збереження Розберемося з збереженням даних використовуючи бібліотеку Objectify на прикладі https://code.google.com/p/objectify-appengine/wiki/BasicOperations#Saving

Збереження

Розберемося з збереженням даних використовуючи бібліотеку Objectify на прикладі
https://code.google.com/p/objectify-appengine/wiki/BasicOperations#Saving

Слайд 20

Збереження Для збереження Entity ObjectifyService.ofy().save().entity(entity).now(); Гарна практика визначити статичний метод ofy

Збереження

Для збереження Entity
ObjectifyService.ofy().save().entity(entity).now();
Гарна практика визначити статичний метод ofy що буде повертати

нам даний сервіс
подивимося OfyService клас нашого проекту
Таким чином, збереження нашого профайлу буде виглядати наступним чином:
ofy().save().entity(profile).now();
Слайд 21

Збереження Внесемо необхідні зміни в проект і запустимо його Запустимо консоль

Збереження

Внесемо необхідні зміни в проект і запустимо його
Запустимо консоль управління
http://apis-explorer.appspot.com/apis-explorer/?base=http://localhost:8080/_ah/api
Спробуємо

тепер наш метод saveProfile
Слайд 22

Слайд 23

Збереження Тепер підемо в панель управління в datastore

Збереження

Тепер підемо в панель управління в datastore

Слайд 24

Збереження Тут ви можете: переглядати свої сутності змінювати їх робити запити до них

Збереження

Тут ви можете:
переглядати свої сутності
змінювати їх
робити запити до них

Слайд 25

Key conflicts Ми говорили, що є два способи отримати ключ: автоматичний

Key conflicts

Ми говорили, що є два способи отримати ключ:
автоматичний
в даному

випадку, Google відповідає за унікальність ключів
на основі нашого id
якщо в ваших Entity співпадуть ID, datastore згенерує однаковий ключ
Слайд 26

Видобування даних Видобування даних таке ж просте як і збереження: Key

Видобування даних

Видобування даних таке ж просте як і збереження:
Key key =

Key.create(Entity.class, id);
Entity entity = ofy().load().key(key).now();
Слайд 27

Видобування даних Подивимося на практиці В нас в API є метод

Видобування даних

Подивимося на практиці
В нас в API є метод getProfile
Що необхідно

зробити?
@ApiMethod(name = "getProfile", path = "profile", httpMethod = HttpMethod.GET)
public Profile getProfile(final User user) throws UnauthorizedException {
if (user == null) {
throw new UnauthorizedException("Authorization required");
}
// TODO
// load the Profile Entity
String userId = ""; // TODO
Key key = null; // TODO
Profile profile = null; // TODO load the Profile entity
return profile;
}
Слайд 28

Видобування даних @ApiMethod(name = "getProfile", path = "profile", httpMethod = HttpMethod.GET)

Видобування даних

@ApiMethod(name = "getProfile", path = "profile", httpMethod = HttpMethod.GET)
public Profile

getProfile(final User user) throws UnauthorizedException {
if (user == null) {
throw new UnauthorizedException("Authorization required");
}
String userId = user.getUserId();
Key key = Key.create(Profile.class,userId);
Profile profile = (Profile)ofy().load().key(key).now();
return profile;
}
Слайд 29

Видобування даних Або так @ApiMethod(name = "getProfile", path = "profile", httpMethod

Видобування даних

Або так
@ApiMethod(name = "getProfile", path = "profile", httpMethod = HttpMethod.GET)
public

Profile getProfile(final User user) throws UnauthorizedException {
if (user == null) {
throw new UnauthorizedException("Authorization required");
}
String userId = user.getUserId();
Key key = Key.create(Profile.class,userId);
Profile profile = ofy().load().key(key).now();
return profile;
}
Слайд 30

Видобування даних Зробимо зміни та запустимо проект Протестуємо наш API Збережіть профайл потім спробуйте getProfile

Видобування даних

Зробимо зміни та запустимо проект
Протестуємо наш API
Збережіть профайл
потім спробуйте getProfile

Слайд 31

Видобування даних

Видобування даних

Слайд 32

Оновлення Entity Якщо ви звернете увагу на метод saveProfile Ми кожний

Оновлення Entity

Якщо ви звернете увагу на метод saveProfile
Ми кожний раз створюємо

новий Profile
Чому ми це робимо?
Яка проблема з ключами?
Слайд 33

Оновлення Entity Ми кожен раз створюємо новий об’єкт і затираємо старий

Оновлення Entity

Ми кожен раз створюємо новий об’єкт і затираємо старий
Інакше ми

б отримали конфлікт ключів
Інколи нам хочеться просто оновити дані існуючої сутності
Як це зробити?
Слайд 34

Оновлення Entity Мені потрібно лише трохи змінити метод saveProfile Profile profile

Оновлення Entity

Мені потрібно лише трохи змінити метод saveProfile
Profile profile = getProfile(user);
if

(profile == null)
profile = new Profile(userId, displayName, mainEmail, teeShirtSize);
else
profile.update(displayName,teeShirtSize);
та дописати метод update в Profile клас
Слайд 35

До змін

До змін

Слайд 36

До змін Я змінив лише одне поле Що відбулося?

До змін

Я змінив лише одне поле
Що відбулося?

Слайд 37

Після змін

Після змін

Слайд 38

Після змін

Після змін

Слайд 39

Conference Central Ми з вами зробили два методи з API В

Conference Central

Ми з вами зробили два методи з API
В проекті який

ми імпортували наявний повний Web UI
Таким чином як тільки ми зробили API по роботі з профайлом користувача, він почав працювати в Веб інтерфейсі
Давайте подивимося в controllers.js на save and get profile
Слайд 40

Web UI and Backend API

Web UI and Backend API

Слайд 41

Web UI and Backend API Якщо ви зробили все про що

Web UI and Backend API

Якщо ви зробили все про що ми

говорили і запустили застосування, то ви мали б отримати помилку
Це тому, що нам потрібно авторизувати Web UI в Backend API
Слайд 42

Web UI and Backend API В нашому випадку обидві ці частини

Web UI and Backend API

В нашому випадку обидві ці частини знаходяться

в одному проекті, але це не обов’язково!!!
Слайд 43

Web UI and Backend API В будь-якому випадку (один проект, окремі

Web UI and Backend API

В будь-якому випадку (один проект, окремі проекти)

ви маєте авторизувати ваше застосування для використання API
Слайд 44

Web UI and Backend API Подивимося на ConferenceApi @Api(name = "conference",

Web UI and Backend API

Подивимося на ConferenceApi
@Api(name = "conference",
version =

"v1",
scopes = { Constants.EMAIL_SCOPE },
clientIds = {
Constants.WEB_CLIENT_ID,
Constants.API_EXPLORER_CLIENT_ID },
description = "API for the Conference Central Backend application.")
public class ConferenceApi {
Слайд 45

Web UI and Backend API Подивимося в Constants public static final

Web UI and Backend API

Подивимося в Constants
public static final String WEB_CLIENT_ID

= "replace this with your Web cliend ID";
Ми маємо замінити цю стрічку нашим ID
Ви можете знайти його в вашій девелоперській консолі на App Engine
Слайд 46

Web UI and Backend API

Web UI and Backend API

Слайд 47

Web UI and Backend API

Web UI and Backend API

Слайд 48

Web UI and Backend API

Web UI and Backend API

Слайд 49

Web UI and Backend API

Web UI and Backend API

Слайд 50

Web UI and Backend API Тепер в нас є client ID

Web UI and Backend API

Тепер в нас є client ID
Вставимо

його в наші константи
public static final String WEB_CLIENT_ID = "508913531626-2bi19p760ej2h5fjc1g3c6himhkjbpcu.apps.googleusercontent.com";
Слайд 51

Web UI and Backend API Також нам треба, що б наше

Web UI and Backend API

Також нам треба, що б наше застосування

вірно авторизувалося
Для цього в нас є файл app.js
в ньому треба знайти CLIENT_ID
і також вставити наш код