์ฐธ๊ณ : ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๊ฐ๋ฐ์๋ NDB ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. NDB ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๊ตํ ๋ Memcache API๋ฅผ ํตํ ์๋ ํญ๋ชฉ ์บ์ฑ๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ด์ ์ด ์์ต๋๋ค. ํ์ฌ ์ด์ DB ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ ์ค์ธ ๊ฒฝ์ฐ DB์์ NDB๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
Query
ํด๋์ค๋ App Engine Datastore์์ ํญ๋ชฉ์ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ๋ฅผ ๋ํ๋
๋๋ค. SQL๊ณผ ์ ์ฌํ ์ฟผ๋ฆฌ ์ธ์ด์ธ GQL์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๋ ๊ด๋ จ GqlQuery
ํด๋์ค๋ ์ฐธ์กฐํ์ธ์.
Query
์ ๋ชจ๋ google.appengine.ext.db
์ ์ ์๋ฉ๋๋ค.
์ฐธ๊ณ : ์์ธ ๊ธฐ์ค ์ฟผ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๋ค์ํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๊ณ ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ์ง๋ง ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช๋ช ์ข ๋ฅ์ ์ฟผ๋ฆฌ๋ ์ง์ํ์ง ์์ต๋๋ค. ํนํ ์กฐ์ธ ๋ฐ ์ง๊ณ ์ฟผ๋ฆฌ๋ Datastore ์ฟผ๋ฆฌ ์์ง์์ ์ง์๋์ง ์์ต๋๋ค. Datastore ์ฟผ๋ฆฌ์ ์ ํ์ฌํญ์ Datastore ์ฟผ๋ฆฌ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
์๊ฐ
์ ํ๋ฆฌ์ผ์ด์
์์ ํน์ ํญ๋ชฉ ์ข
๋ฅ์ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ค๋ฉด Query
์์ฑ์๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค.
class Song(db.Model): title = db.StringProperty() composer = db.StringProperty() date = db.DateTimeProperty() q = db.Query(Song)
๋๋ ์ข
๋ฅ์ ๋ชจ๋ธ ํด๋์ค์ ๋ํ ํด๋์ค ๋ฉ์๋ all()
์ ํธ์ถํฉ๋๋ค.
q = Song.all()
Query
ํด๋์ค์ ๊ฒฐ๊ณผ ์ธ์คํด์ค๋ ์ถ๊ฐ ์์ ์์ด ์ง์ ๋ ์ข
๋ฅ์ ๊ธฐ์กด ํญ๋ชฉ์ ๋ชจ๋ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ฐ์ฒด์์ ๋ฉ์๋ ํธ์ถ์ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ํํฐ ๊ธฐ์ค, ์์ ์กฐ๊ฑด, ์ ๋ ฌ ์์์ ํจ๊ป ์ฟผ๋ฆฌ๋ฅผ ๋ง์ถค์ค์ ํ ์ ์์ต๋๋ค.
q.filter('title =', 'Imagine') q.ancestor(ancestor_key) q.order('-date')
ํธ์๋ฅผ ์ํด ๋ชจ๋ ๋ฉ์๋๋ ๋จ์ผ ๊ตฌ๋ฌธ์์ ํ์๋ก ์ ํ๋ ์ ์๋๋ก ์ฟผ๋ฆฌ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
q.filter('title =', 'Imagine').ancestor(key).order('-date')
๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ๋ฐฉ๋ฒ ์ค ํ ๊ฐ์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
-
์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ทจ๊ธํ์ฌ ์ผ์นํ๋ ํญ๋ชฉ์ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌํฉ๋๋ค.
for song in q: print song.title
์ด๋ ์์์ ์ผ๋ก ์ฟผ๋ฆฌ์
run()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ผ์นํ๋ ํญ๋ชฉ์ ์์ฑํ๋ฉฐ, ๋ฐ๋ผ์ ๋ค์๊ณผ ๋์ผํฉ๋๋ค.for song in q.run(): print song.title
ํค์๋ ์ธ์
limit
์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฐ๊ณผ ์์ ํ๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.for song in q.run(limit=5): print song.title
๋ฐ๋ณต์ ์ธํฐํ์ด์ค๋ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ง ์์ผ๋ฏ๋ก ์ฟผ๋ฆฌ ๊ฐ์ฒด์์ ์๋ก์ด ๋ฐ๋ณต์๋ฅผ ๋ง๋ค๋ฉด ๋์ผํ ์ฟผ๋ฆฌ๊ฐ ์ฒ์๋ถํฐ ๋ฐ๋ณต๋ฉ๋๋ค.
-
Datastore์์ ์ฐพ์ ์ฒซ ๋ฒ์งธ ๋จ์ผ ์ผ์น ํญ๋ชฉ์ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ฟผ๋ฆฌ์
get()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.song = q.get() print song.title
-
์ง์ ๋ ๊ฒฐ๊ณผ ์๋งํผ ์ผ์นํ๋ ๋ชจ๋ ํญ๋ชฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ฟผ๋ฆฌ์
fetch()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.results = q.fetch(limit=5) for song in results: print song.title
run()
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ง ์์ผ๋ฏ๋กfetch()
๋ฅผ ๋ ๋ฒ์งธ ํธ์ถํ๋ฉด ๋์ผํ ์ฟผ๋ฆฌ๊ฐ ๋ค์ ์คํ๋ฉ๋๋ค.์ฐธ๊ณ : ์ด ๋ฉ์๋๋ ๊ฑฐ์ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฉฐ, ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์
run()
์ ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ฑ์
Query
ํด๋์ค์ ์์ฑ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
- class Query(model_class=None, keys_only=False, cursor=None, namespace=None, projection=None, distinct=False)
-
App Engine Datastore์์ ํญ๋ชฉ์ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉํ
Query
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.๊ฒฐ๊ณผ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ ์ถ๊ฐ ์์ ์์ด
model_class
์์ ์ง์ ๋ ์ข ๋ฅ์ ๋ชจ๋ ๊ธฐ์กด ํญ๋ชฉ์ ๊ฒ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ธ์คํด์ค ๋ฉ์๋filter()
,ancestor(),
,order()
๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ํํฐ ๊ธฐ์ค, ์์ ์กฐ๊ฑด, ์ ๋ ฌ ์์๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ง์ถค์ค์ ํ ์ ์์ต๋๋ค.์ธ์
- model_class
- ์ฟผ๋ฆฌ๊ฐ ์ ์ฉํ๋ ํญ๋ชฉ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ ๋ชจ๋ธ(๋๋ Expando) ํด๋์ค์ ๋๋ค.
- keys_only
true
์ธ ๊ฒฝ์ฐ ์ ์ฒด ํญ๋ชฉ ๋์ ํค๋ง ๋ฐํํฉ๋๋ค. ํค ์ ์ฉ ์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์ ๋๋ค.- cursor
- ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ์์ํ ์ปค์ ์์น์ ๋๋ค.
- namespace
- ์ฟผ๋ฆฌ์ ์ฌ์ฉํ ๋ค์์คํ์ด์ค์ ๋๋ค.
- projection
- ๋ฐํํ ์์ฑ ์ด๋ฆ์ ๋ชฉ๋ก ๋๋ ํํ์
๋๋ค. ์ง์ ๋ ์์ฑ์ ๊ฐ์ง ํญ๋ชฉ๋ง ๋ฐํ๋๋ฉฐ, ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด ํญ๋ชฉ์ด ๋ฐํ๋ฉ๋๋ค.
ํ๋ก์ ์
์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์
๋๋ค.
์ฐธ๊ณ : ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋ฉด ์ฟผ๋ฆฌ์ ์์ธ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- distinct
- ํ๋ก์ ์
์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ distinct=True๋ฅผ ์ค์ ํ๋ฉด ๊ฒฐ๊ณผ ์งํฉ์์ ์์ ํ ๊ณ ์ ํ ๊ฒฐ๊ณผ๋ง ๋ฐํ๋ฉ๋๋ค. ์ฆ, ํ๋ก์ ์
๋๋ ์์ฑ ๊ฐ์ด ๋์ผํ ํญ๋ชฉ์ ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ง ๋ฐํ๋ฉ๋๋ค.
- ์ฐธ
- ํ๋ก์ ์ ์์ ๊ณ ์ ํ ๊ฐ ์์ฑ ๊ฐ ์ธํธ์ ๋ํด ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ง ๋ฐํ๋ฉ๋๋ค.
- ๊ฑฐ์ง
- ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ฉ๋๋ค.
์ธ์คํด์ค ๋ฉ์๋
Query
ํด๋์ค์ ์ธ์คํด์ค์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
- filter(property_operator, value)
-
์ฟผ๋ฆฌ์ ์์ฑ ํํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ชจ๋ ํํฐ๋ฅผ ์ถฉ์กฑํ๋ ์์ฑ์ ๊ฐ์ง ํญ๋ชฉ๋ง ๋ฐํ๋ฉ๋๋ค.
์ธ์
- property_operator
- ์์ฑ ์ด๋ฆ ๋ฐ ์ ํ์ ๋น๊ต ์ฐ์ฐ์(
=
,!=
,<
,<=
,>
,>=
,IN
)๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด๋ก,'age
>'
์ ๊ฐ์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๋น๊ต ์ฐ์ฐ์ ์์ด ์์ฑ ์ด๋ฆ๋ง ์ง์ ํ๋ฉด ํํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ก ๊ท ๋ฑ(=
)ํ์ง ๋น๊ตํฉ๋๋ค. - value
- ์์ฑ๊ฐ๊ณผ ๋น๊ตํ ๊ฐ์
๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
q.filter('height >', 42).filter('city =', 'Seattle') q.filter('user =', users.get_current_user())
์ง์ ๋ ๋น๊ต ๊ฐ๊ณผ ๋น๊ตํ ์์ฑ ๊ฐ์ ๊ฐ ์ ํ์ด ๋์ผํด์ผ ํฉ๋๋ค.
- ancestor(ancestor)
-
์ฟผ๋ฆฌ์ ์์ ํํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์์๊ฐ ์ง์ ๋ ํญ๋ชฉ๋ง ๋ฐํ๋ฉ๋๋ค.
์ธ์
- ancestor
- ์์ ํญ๋ชฉ ๋๋ ํค์ ๋๋ค.
- order(property)
-
์ฟผ๋ฆฌ์ ์ ๋ ฌ ์์๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ ๋ ฌ ์์๊ฐ ๋ ์ด์ ์ถ๊ฐ๋๋ฉด ์ง์ ํ ์์๋๋ก ์ ์ฉ๋ฉ๋๋ค.
์ธ์
- property
- ์ ๋ ฌ์ ๊ธฐ์ค์ด ๋๋ ์์ฑ์ ์ด๋ฆ์ ์ ๊ณตํ๋ ๋ฌธ์์ด๋ก, ํ์ํ ๊ฒฝ์ฐ ๋ฌธ์์ด ์์ ํ์ดํ(
-
)์ ์ฌ์ฉํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ํ์ดํ์ ์๋ตํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฆ์ฐจ์์ด ์ง์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.# Order alphabetically by last name: q.order('last_name') # Order by height, tallest to shortest: q.order('-height')
- projection()
-
ํ๋ก์ ์ ์ ์์ฑ ํํ ๋๋
None
์ ๋ฐํํฉ๋๋ค. - is_keys_only()
-
์ฟผ๋ฆฌ๊ฐ ํค ์ ์ฉ ์ฟผ๋ฆฌ์ธ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ์ธ ๊ฐ์ ๋ฐํํฉ๋๋ค.
- run (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, limit=None, batch_size=20, keys_only=False, projection=None, start_cursor=None, end_cursor=None)
-
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฃจํ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐ๋ณต ๊ฐ๋ฅ ํญ๋ชฉ์ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋งค๊ฐ๋ณ์ ์ค์ ์ผ๋ก ์ฟผ๋ฆฌ์ ์์ ์ ์ง์ ํ๊ณ ๊ฒฐ๊ณผ์ ๋ฐ๋ณต์ ์ผ๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค.
offset
์ธ์๋ก ์ง์ ๋ ๊ฒฐ๊ณผ ์๋งํผ ๊ฒ์ํ๊ณ ์ญ์ ํฉ๋๋ค.limit
์ธ์๋ก ์ง์ ๋ ์ต๋ ๊ฒฐ๊ณผ ์๋งํผ ๊ฒ์ํ๊ณ ๋ฐํํฉ๋๋ค.
๋ฐ๋ผ์ ๋ฃจํ์ ์ฑ๋ฅ์
offset
๊ณผlimit
์ ํฉ๊ณ์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ๊ฒ์ํ๋ ค๋ ๊ฒฐ๊ณผ ์๋ฅผ ์๊ณ ์๋ค๋ฉดlimit
๊ฐ์ ํญ์ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.์ด ๋ฉ์๋๋ ์ฑ๋ฅ ํฅ์์ ์ํด ๋น๋๊ธฐ์ ํ๋ฆฌํ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Datastore์์ ์๊ท๋ชจ ๋ฐฐ์น๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ๋ณต์ ์ค๋จํ์ฌ ํ์ ์ด์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
ํ: ๊ฒฐ๊ณผ ์๋ฅผ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ ค๋ฉด
batch_size
๋ฅผ1000
๊ณผ ๊ฐ์ด ํฐ ๊ฐ์ผ๋ก ์ค์ ํ์ธ์.ํ: ๊ธฐ๋ณธ ์ธ์ ๊ฐ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ผ๋ฉด ๋ฃจํ๋ฅผ ์ ์ดํ๊ธฐ ์ํ ๋ฐ๋ณต ๊ฐ๋ฅ ํญ๋ชฉ์ผ๋ก ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ง์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ธฐ๋ณธ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ
run()
์ด ์์์ ์ผ๋ก ํธ์ถ๋ฉ๋๋ค.์ธ์
- read_policy
- ์ํ๋ ์์ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ง์ ํ๋ ์ฝ๊ธฐ ์ ์ฑ
์
๋๋ค.
- STRONG_CONSISTENCY
- ์ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ์ง๋ง ๋จ์ผ ํญ๋ชฉ ๊ทธ๋ฃน์ผ๋ก ์ ํ๋ฉ๋๋ค.
- EVENTUAL_CONSISTENCY
- ์ฌ๋ฌ ํญ๋ชฉ ๊ทธ๋ฃน์ ํฌ๊ดํ ์ ์์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ค๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ต์ข ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ ๊ฐ๋ ฅํ ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋ ๋นจ๋ฆฌ ์คํ๋์ง๋ง ์๋ฌด๊ฒ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค.
์ฐธ๊ณ : ์์๊ฐ ์๋ ์ ์ญ ์ฟผ๋ฆฌ๋ ์ด ์ธ์๋ฅผ ๋ฌด์ํฉ๋๋ค.
- deadline
- ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ค๋จ๋๊ธฐ ์ Datastore์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ(์ด)์ ๋๋ค. ์ ์ ๋๋ ๋ถ๋ ์์์ ๊ฐ์ ํ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ(60์ด)๋ณด๋ค ๋๊ฒ ์ค์ ํ ์๋ ์์ง๋ง ํน์ ์์ ์ด ๋น ๋ฅด๊ฒ ์คํจํ๋๋ก ํ๊ธฐ ์ํด ๋ฎ๊ฒ ์กฐ์ ํ ์๋ ์์ต๋๋ค(์: ์ฌ์ฉ์์๊ฒ ์๋ต์ ๋ ๋นจ๋ฆฌ ๋ฐํ, ์์ ์ฌ์๋, ๋ค๋ฅธ ์์ ์๋, ํ์คํฌ ํ์ ์์ ์ถ๊ฐ).
- offset
- ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ๊ฑด๋๋ธ ๊ฒฐ๊ณผ ์์ ๋๋ค.
- limit
- ๋ฐํํ ์ต๋ ๊ฒฐ๊ณผ ์์
๋๋ค.
์๋ตํ๊ฑฐ๋
None
์ผ๋ก ์ค์ ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. - batch_size
- ๋ฐฐ์น๋น ๊ฒ์์ ์๋ํ ๊ฒฐ๊ณผ ์์
๋๋ค.
limit
๋ฅผ ์ค์ ํ๋ฉด ์ง์ ๋ ํ๋๋ก ๊ธฐ๋ณธ ์ค์ ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์20
์ ๋๋ค. - keys_only
true
์ธ ๊ฒฝ์ฐ ์ ์ฒด ํญ๋ชฉ ๋์ ํค๋ง ๋ฐํํฉ๋๋ค. ํค ์ ์ฉ ์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์ ๋๋ค.- projection
- ๋ฐํํ ์์ฑ ์ด๋ฆ์ ๋ชฉ๋ก ๋๋ ํํ์
๋๋ค. ์ง์ ๋ ์์ฑ์ ๊ฐ์ง ํญ๋ชฉ๋ง ๋ฐํ๋๋ฉฐ, ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด ํญ๋ชฉ์ด ๋ฐํ๋ฉ๋๋ค.
ํ๋ก์ ์
์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์
๋๋ค.
์ฐธ๊ณ : ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋ฉด ์ฟผ๋ฆฌ์ ์์ธ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- start_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์์ํ ์ปค์ ์์น์ ๋๋ค.
- end_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ ์ปค์ ์์น์ ๋๋ค.
- get (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, keys_only=False, projection=None, start_cursor=None, end_cursor=None)
-
์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฑฐ๋, ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด
None
์ ๋ฐํํฉ๋๋ค.์ธ์
- read_policy
- ์ํ๋ ์์ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ง์ ํ๋ ์ฝ๊ธฐ ์ ์ฑ
์
๋๋ค.
- STRONG_CONSISTENCY
- ์ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ์ง๋ง ๋จ์ผ ํญ๋ชฉ ๊ทธ๋ฃน์ผ๋ก ์ ํ๋ฉ๋๋ค.
- EVENTUAL_CONSISTENCY
- ์ฌ๋ฌ ํญ๋ชฉ ๊ทธ๋ฃน์ ํฌ๊ดํ ์ ์์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ค๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ต์ข ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ ๊ฐ๋ ฅํ ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋ ๋นจ๋ฆฌ ์คํ๋์ง๋ง ์๋ฌด๊ฒ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค.
์ฐธ๊ณ : ์์๊ฐ ์๋ ์ ์ญ ์ฟผ๋ฆฌ๋ ์ด ์ธ์๋ฅผ ๋ฌด์ํฉ๋๋ค.
- deadline
- ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ค๋จ๋๊ธฐ ์ Datastore์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ(์ด)์ ๋๋ค. ์ ์ ๋๋ ๋ถ๋ ์์์ ๊ฐ์ ํ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ(60์ด)๋ณด๋ค ๋๊ฒ ์ค์ ํ ์๋ ์์ง๋ง ํน์ ์์ ์ด ๋น ๋ฅด๊ฒ ์คํจํ๋๋ก ํ๊ธฐ ์ํด ๋ฎ๊ฒ ์กฐ์ ํ ์๋ ์์ต๋๋ค(์: ์ฌ์ฉ์์๊ฒ ์๋ต์ ๋ ๋นจ๋ฆฌ ๋ฐํ, ์์ ์ฌ์๋, ๋ค๋ฅธ ์์ ์๋, ํ์คํฌ ํ์ ์์ ์ถ๊ฐ).
- offset
- ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ๊ฑด๋๋ธ ๊ฒฐ๊ณผ ์์ ๋๋ค.
- keys_only
true
์ธ ๊ฒฝ์ฐ ์ ์ฒด ํญ๋ชฉ ๋์ ํค๋ง ๋ฐํํฉ๋๋ค. ํค ์ ์ฉ ์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์ ๋๋ค.- projection
- ๋ฐํํ ์์ฑ ์ด๋ฆ์ ๋ชฉ๋ก ๋๋ ํํ์
๋๋ค. ์ง์ ๋ ์์ฑ์ ๊ฐ์ง ํญ๋ชฉ๋ง ๋ฐํ๋๋ฉฐ, ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด ํญ๋ชฉ์ด ๋ฐํ๋ฉ๋๋ค.
ํ๋ก์ ์
์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์
๋๋ค.
์ฐธ๊ณ : ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋ฉด ์ฟผ๋ฆฌ์ ์์ธ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- start_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์์ํ ์ปค์ ์์น์ ๋๋ค.
- end_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ ์ปค์ ์์น์ ๋๋ค.
- fetch (limit, read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, keys_only=False, projection=None, start_cursor=None, end_cursor=None)
-
์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ (๋น์ด ์์ ์ ์๋) ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
offset
์ธ์๋ก ์ง์ ๋ ๊ฒฐ๊ณผ ์๋งํผ ๊ฒ์ํ๊ณ ์ญ์ ํฉ๋๋ค.limit
์ธ์๋ก ์ง์ ๋ ์ต๋ ๊ฒฐ๊ณผ ์๋งํผ ๊ฒ์ํ๊ณ ๋ฐํํฉ๋๋ค.
๋ฐ๋ผ์ ๋ฉ์๋์ ์ฑ๋ฅ์
offset
๊ณผlimit
์ ํฉ๊ณ์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ํ์ฅ๋ฉ๋๋ค.์ฐธ๊ณ : ์ด ๋ฉ์๋๋
run()
๋ฉ์๋ ์ฃผ๋ณ์ ์ฌ ๋ํผ์ ๋ถ๊ณผํ๋ฉฐrun()
์ ์ง์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์จ์ฑ์ ๋ฎ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ๋ง์ด ์๋ชจํฉ๋๋ค.fetch()
๋ ๊ฑฐ์ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ฃผ๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ฉ๋ชจ๋ฆฌ ๋ด ์ ์ฒด ๋ชฉ๋ก์ ๊ฒ์ํด์ผ ํ๋ ๊ฒฝ์ฐ ํธ์๋ฅผ ์ํด ์ ๊ณต๋ฉ๋๋ค.ํ:
fetch()
๋ฉ์๋๋limit
์ธ์๋ก ์ง์ ๋ ๊ฒฐ๊ณผ ์๋งํผ๋ง ๊ฒ์ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ฒฐ๊ณผ ์๋ฅผ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ ค๋ฉดfetch()
๋์run()
๋ฅผ ํฐ ๊ฐ(์:run(batch_size=1000)
)์ผ๋ก ์ค์ ํด ์ฌ์ฉํ์ธ์.์ธ์
- limit
- ๋ฐํํ ์ต๋ ๊ฒฐ๊ณผ ์์
๋๋ค.
None
์ผ๋ก ์ค์ ํ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ๊ฒ์๋ฉ๋๋ค. - read_policy
- ์ํ๋ ์์ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ง์ ํ๋ ์ฝ๊ธฐ ์ ์ฑ
์
๋๋ค.
- STRONG_CONSISTENCY
- ์ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ์ง๋ง ๋จ์ผ ํญ๋ชฉ ๊ทธ๋ฃน์ผ๋ก ์ ํ๋ฉ๋๋ค.
- EVENTUAL_CONSISTENCY
- ์ฌ๋ฌ ํญ๋ชฉ ๊ทธ๋ฃน์ ํฌ๊ดํ ์ ์์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ค๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ต์ข ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ ๊ฐ๋ ฅํ ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋ ๋นจ๋ฆฌ ์คํ๋์ง๋ง ์๋ฌด๊ฒ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค.
์ฐธ๊ณ : ์์๊ฐ ์๋ ์ ์ญ ์ฟผ๋ฆฌ๋ ์ด ์ธ์๋ฅผ ๋ฌด์ํฉ๋๋ค.
- deadline
- ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ค๋จ๋๊ธฐ ์ Datastore์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ(์ด)์ ๋๋ค. ์ ์ ๋๋ ๋ถ๋ ์์์ ๊ฐ์ ํ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ(60์ด)๋ณด๋ค ๋๊ฒ ์ค์ ํ ์๋ ์์ง๋ง ํน์ ์์ ์ด ๋น ๋ฅด๊ฒ ์คํจํ๋๋ก ํ๊ธฐ ์ํด ๋ฎ๊ฒ ์กฐ์ ํ ์๋ ์์ต๋๋ค(์: ์ฌ์ฉ์์๊ฒ ์๋ต์ ๋ ๋นจ๋ฆฌ ๋ฐํ, ์์ ์ฌ์๋, ๋ค๋ฅธ ์์ ์๋, ํ์คํฌ ํ์ ์์ ์ถ๊ฐ).
- offset
- ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ๊ฑด๋๋ธ ๊ฒฐ๊ณผ ์์ ๋๋ค.
- keys_only
true
์ธ ๊ฒฝ์ฐ ์ ์ฒด ํญ๋ชฉ ๋์ ํค๋ง ๋ฐํํฉ๋๋ค. ํค ์ ์ฉ ์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์ ๋๋ค.- projection
- ๋ฐํํ ์์ฑ ์ด๋ฆ์ ๋ชฉ๋ก ๋๋ ํํ์
๋๋ค. ์ง์ ๋ ์์ฑ์ ๊ฐ์ง ํญ๋ชฉ๋ง ๋ฐํ๋๋ฉฐ, ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด ํญ๋ชฉ์ด ๋ฐํ๋ฉ๋๋ค.
ํ๋ก์ ์
์ฟผ๋ฆฌ๋ ์ ์ฒด ํญ๋ชฉ์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฒฝ์ ์ ์
๋๋ค.
์ฐธ๊ณ : ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋ฉด ์ฟผ๋ฆฌ์ ์์ธ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- start_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์์ํ ์ปค์ ์์น์ ๋๋ค.
- end_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ ์ปค์ ์์น์ ๋๋ค.
- count (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, limit=1000, start_cursor=None, end_cursor=None)
-
์ฟผ๋ฆฌ์ ์ผ์นํ๋ ๊ฒฐ๊ณผ์ ๊ฐ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๊ฒ์ํ๋ ๊ฒ๋ณด๋ค ์ผ์ ํ ๋น์จ๋งํผ ๋ ๋น ๋ฅด์ง๋ง ์คํ ์๊ฐ์ ์ฌ์ ํ
offset
๊ณผlimit
์ ํฉ์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ๊ฒฐ๊ณผ ์๊ฐ ์์ ๊ฒ์ผ๋ก ์์๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉดlimit
์ธ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณ์๊ฐ ๋๋๊ฑฐ๋ ํ์์์๋ ๋๊น์ง ๋ฉ์๋๊ฐ ๊ณ์ ์คํ๋ฉ๋๋ค.์ธ์
- read_policy
- ์ํ๋ ์์ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ง์ ํ๋ ์ฝ๊ธฐ ์ ์ฑ
์
๋๋ค.
- STRONG_CONSISTENCY
- ์ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ์ง๋ง ๋จ์ผ ํญ๋ชฉ ๊ทธ๋ฃน์ผ๋ก ์ ํ๋ฉ๋๋ค.
- EVENTUAL_CONSISTENCY
- ์ฌ๋ฌ ํญ๋ชฉ ๊ทธ๋ฃน์ ํฌ๊ดํ ์ ์์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ค๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ต์ข ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ ๊ฐ๋ ฅํ ์ผ๊ด์ฑ์ ์ง๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋ ๋นจ๋ฆฌ ์คํ๋์ง๋ง ์๋ฌด๊ฒ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค.
์ฐธ๊ณ : ์์๊ฐ ์๋ ์ ์ญ ์ฟผ๋ฆฌ๋ ์ด ์ธ์๋ฅผ ๋ฌด์ํฉ๋๋ค.
- deadline
- ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ค๋จ๋๊ธฐ ์ Datastore์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ(์ด)์ ๋๋ค. ์ ์ ๋๋ ๋ถ๋ ์์์ ๊ฐ์ ํ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ(60์ด)๋ณด๋ค ๋๊ฒ ์ค์ ํ ์๋ ์์ง๋ง ํน์ ์์ ์ด ๋น ๋ฅด๊ฒ ์คํจํ๋๋ก ํ๊ธฐ ์ํด ๋ฎ๊ฒ ์กฐ์ ํ ์๋ ์์ต๋๋ค(์: ์ฌ์ฉ์์๊ฒ ์๋ต์ ๋ ๋นจ๋ฆฌ ๋ฐํ, ์์ ์ฌ์๋, ๋ค๋ฅธ ์์ ์๋, ํ์คํฌ ํ์ ์์ ์ถ๊ฐ).
- offset
- ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ํ๊ธฐ ์ ์ ๊ฑด๋๋ธ ๊ฒฐ๊ณผ ์์ ๋๋ค.
- limit
- ๊ณ์ํ ์ต๋ ๊ฒฐ๊ณผ ์์ ๋๋ค.
- start_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์์ํ ์ปค์ ์์น์ ๋๋ค.
- end_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ ์ปค์ ์์น์ ๋๋ค.
- index_list()
-
๊ธฐ๋ณธ, ๋ณตํฉ, ์ข ๋ฅ, ๋จ์ผ ์์ฑ ์์ธ์ ๋น๋กฏํ์ฌ ์คํ๋ ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋๋ ์์ธ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
์ฃผ์: ์์ง ์คํ๋์ง ์์ ์ฟผ๋ฆฌ์์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด
AssertionError
์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.์ฐธ๊ณ : ์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐ ์๋ฒ์์ ์๋ฒฝํ๊ฒ ์ง์๋์ง ์์ต๋๋ค. ๊ฐ๋ฐ ์๋ฒ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ ๋น ๋ชฉ๋ก์ด๊ฑฐ๋ ์ ํํ ํ๋์ ๋ณตํฉ ์์ธ์ด ํฌํจ๋ ๋ชฉ๋ก์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋๋ ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ๋ ์์ธ์ ๋ํด ๋ค์ํ ์ ๋ณด๋ฅผ ์ธ์ํฉ๋๋ค.
# other imports ... import webapp2 from google.appengine.api import users from google.appengine.ext import db class Greeting(db.Model): author = db.StringProperty() content = db.StringProperty(multiline=True) date = db.DateTimeProperty(auto_now_add=True) class MainPage(webapp2.RequestHandler): def get(self): user = users.get_current_user() q = db.Query(Greeting) q.filter("author =", user.user_id()) q.order("-date") q.fetch(100) index_list = q.index_list() for ix in index_list: self.response.out.write("Kind: %s" % ix.kind()) self.response.out.write("<br />") self.response.out.write("Has ancestor? %s" % ix.has_ancestor()) self.response.out.write("<br />") for name, direction in ix.properties(): self.response.out.write("Property name: "+name) self.response.out.write("<br />") if direction == db.Index.DESCENDING: self.response.out.write("Sort direction: DESCENDING") else: self.response.out.write("Sort direction: ASCENDING") self.response.out.write("<br />")
์ด๋ ๊ฐ ์์ธ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ์ถ๋ ฅํฉ๋๋ค.
Kind: Greeting Has ancestor? False Property name: author Sort direction: ASCENDING Property name: date Sort direction: DESCENDING
- cursor()
-
๊ฒ์๋ ๋ง์ง๋ง ๊ฒฐ๊ณผ ๋ค์์ ์ค๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ์ ์์น๋ฅผ ๋ํ๋ด๋ base64๋ก ์ธ์ฝ๋ฉ๋ ์ปค์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. ์ปค์ ๋ฌธ์์ด์ HTTP
GET
๋ฐPOST
๋งค๊ฐ๋ณ์์ ์ฌ์ฉํ๊ธฐ์ ์์ ํ๋ฉฐ Datastore ๋๋ Memcache์๋ ์ ์ฅํ ์ ์์ต๋๋ค. ๋์ค์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํ ๋start_cursor
๋งค๊ฐ๋ณ์ ๋๋with_cursor()
๋ฉ์๋๋ฅผ ํตํด ์ด ๋ฌธ์์ด์ ์ ๊ณตํ๋ฉด ์ด ์์น์์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ ๊ฒ์ํ ์ ์์ต๋๋ค.์ฃผ์: ์์ง ์คํ๋์ง ์์ ์ฟผ๋ฆฌ์์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด
AssertionError
์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.์ฐธ๊ณ : ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ์ปค์์ ํธํ๋๋ ๊ฒ์ ์๋๋๋ค. ์์ธํ ์ ๋ณด๋ Datastore ์ฟผ๋ฆฌ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
- with_cursor (start_cursor, end_cursor=None)
-
๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ ๋ด์ ์์ ์์น์ (ํ์ํ ๊ฒฝ์ฐ) ์ข ๋ฃ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. ์ด์ ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํ ํ
cursor()
๋ฅผ ํธ์ถํ์ฌ ์์ ์์น์ ์ข ๋ฃ ์์น๋ฅผ ๋ํ๋ด๋ ์ปค์ ๋ฌธ์์ด์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ํ์ฌ ์ฟผ๋ฆฌ๋ ํญ๋ชฉ ์ข ๋ฅ, ์์ฑ ํํฐ, ์์ ํํฐ, ์ ๋ ฌ ์์๋ฅผ ํฌํจํ์ฌ ์ด์ ํธ์ถ๊ณผ ๋์ผํด์ผ ํฉ๋๋ค.์ธ์
- start_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์์ํ ์์น๋ฅผ ์ง์ ํ๋ Base64๋ก ์ธ์ฝ๋ฉ๋ ์ปค์ ๋ฌธ์์ด์ ๋๋ค.
- end_cursor
- ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ ์์น๋ฅผ ์ง์ ํ๋ Base64๋ก ์ธ์ฝ๋ฉ๋ ์ปค์ ๋ฌธ์์ด์ ๋๋ค.