티스토리 뷰


* 이번에는 Google App Engine의 데이터베이스, Datastore를 이용해보자.


2012/10/06 - [Mini Project/NY-School] - [NY-School] Google App Engine과 Python 시작하기전에 공부하기

2012/10/06 - [Mini Project/NY-School] - [NY-School] Google App Engine과 Python 시작하기 - Hello world

2012/10/06 - [Mini Project/NY-School] - [NY-School] Google App Engine과 Python 시작하기 - webapp framework


*개요

: App Engine의 Datastore는 간단한 API로 구글의 인프라를 이용하여 네트워크 트래픽, 분산 등 데이터 유지에서 고려해야하는 사항들을 해결해준다. App Engine의 데이터 저장소는 High Replication Datastore (HRD)로 Parxos 알고리즘을 이용하여 다수의 데이터 센터로 데이터를 중복해서 저장해둔다. 데이터는 entity로서 저장소에 저장되고, 다른 entity를 자식으로 둘 수 있다. 이는 파일 시스템과 비슷한 구조로 이루어져 있어서 다단계의 구조를 가질 수 있다. 


* Datastore를 이용한 예제

: 이번에도 helloworld.py를 수정하자.



: 위의 소스는 App Engine에 포함되어있는 데이터 모델링 API를 이용하고 있다. 일단 from google.appengine.ext import db 를 이용해서 api를 가져온다. 그래서 Greeting의 데이터 모델을 구성한다.

Greeting

author = String

content = String (Multiline)

date = DateTime


: 자세한 Property 설정 스펙은 다음을 참고하자. 나중에 디비 설계를 할때 자세하게 한번 더 볼 것이다.

https://developers.google.com/appengine/docs/python/datastore/


: class MainPage는 '/'에 매핑되어서 폼을 보여준다. db.GqlQuery를 이용해서 방명록을 선택하고 결과를 화면에 출력해준다.


: class Guestbook 핸들러는 방명록이 쓰여졌을 때 Greeting 오브젝트를 만들고 author와 content를 세팅하고, greeting.put을 통해서 데이터를 Datastore에 저장한다. db.Key.from_path는 guestbook_name을 사용하는 Guestbook의 entity를 위한 키를 생성하는 함수이다.


* 데이터 스토어에서 GQL을 이용해서 데이터 선택하는 방법

소스코드에 있는 

greetings = db.GqlQuery("SELECT * FROM Greeting WHERE ANCESTOR IS :1 ORDER BY data DESC LIMIT 10") 

대신에

greetings = Greeting.gql("WHERE ANCESTOR IS :1 ORDER BY date DESC LIMIT 10", guestbook_key(guestbook_name))

로 대체할 수도 있다. 조금은 간단하게 'SELECT * FROM Greeting"이 생략 가능한 것이다.


: 만약에 필터 기능을 넣고 싶다면 WHERE 절에 추가 옵션을 추가하면 된다.

greetings = Greeting.gql("WHERE ANCESTOR = :1 AND data > :1 ORDER BY data DESC" , guestbook_key(guestbook_name), datetime.datetime.now() + datatime.timedelta(days=-7)


이렇게 순차적으로 파라미터를 입력하거나 또는 아래처럼 파라미터 이름을 매핑할수도 있다.


greetings = Greeting.gql("WHERE ANCESTOR = :ancestor AND data > :date ORDER BY data DESC" , ancestor=guestbook_key(guestbook_name), date=datetime.datetime.now() + datatime.timedelta(days=-7)


: 또는 아래와 같이 선택하는 메카니즘도 가능하다.

greetings = Greeting.all()

greetings.ancestor(guestbook_key(guestbook_name))

greetings.fileter("date >" , datetime.datetime.now() + datetime.timedelta(days=-7))

greetings.order("-date")


* 실행

: 이제 다시 실행을 해보자.

: 방명록을 입력해보자. 'Hello, Guestbook!' 입력하고 submit을 해보니,

: 입력한 내용이 출력되었다. (이전에 users의 로그인 창에 로그인했더니 사용자가 출력되어서 나왔다.)


: GAE콘솔로 들어가서 확인해보자. Google App Engine Launcher의 'SDK Console'을 누르거나, http://localhost:8080/_ah/admin/로 접속을 하면 개발용 서버의 datastore 상황을 검색할 수 있다. Greeting에 들어가보면 추가된 것을 볼 수 있다. 이렇게 저장된 데이터는 삭제 요청을 할때까지는 웹서버에 계속 보존하게 되므로 데이터베이스처럼 사용하면 된다.

* index.yaml 생성

: 로컬에서 datastore를 사용하면서 order등을 사용하게 되면 index.yaml파일이 자동으로 생성하게 된다. 들어가서 확인해보면,



: Greeting에서 date를 기준으로 order를 했더니 인덱스가 자동으로 생성되었다. RDB처럼 인덱스를 수동으로 추가를 할수도 있는데, 아래 사이트에 인덱스에 대해서 문서화 되어있다. 나중에 데이터베이스 설계할때 다시 한번 볼 것이다.

https://developers.google.com/appengine/docs/python/datastore/indexes



* GAE와 Python로 Datastore 사용하기 끝.




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함