1
저는 App Engine Datastore의 NoSQL 패러다임이 아닌 SQL에 익숙하므로 조상 쿼리를 올바르게 수행하는 방법을 이해하기 위해 예제 코드를 작성해야했습니다. 내가 너와 여기서 그것을 나눌 줄 알았다. 어쩌면 누군가에게 흥미로울 것입니다.Google App Engine Datastore/NoSQL 예 (조상 쿼리 포함)
저는 App Engine Datastore의 NoSQL 패러다임이 아닌 SQL에 익숙하므로 조상 쿼리를 올바르게 수행하는 방법을 이해하기 위해 예제 코드를 작성해야했습니다. 내가 너와 여기서 그것을 나눌 줄 알았다. 어쩌면 누군가에게 흥미로울 것입니다.Google App Engine Datastore/NoSQL 예 (조상 쿼리 포함)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import webapp2
from google.appengine.ext.webapp.util import run_wsgi_app
import logging
from google.appengine.ext import db
# MODELS
class Child_model(db.Model):
name = db.StringProperty()
class Parent_model(db.Model):
name = db.StringProperty()
class Root_model(db.Model):
pass
# MAIN
class MainHandler(webapp2.RequestHandler):
def get(self, url):
if not Root_model.get_by_key_name("root"):
# Populate db on first run
self.populate()
logging.info("-- Get all enteties recursivly --")
root = Root_model.get_by_key_name("root")
logging.info(" - %s", root)
parents = Parent_model.all().ancestor(root)
# Recursivly
for p in parents:
logging.info(" -- %s" % p.name)
children = list(Child_model.all().ancestor(p))
[logging.info(" --- %s" % c.name) for c in children]
# Shortcut
#children = Child_model.all().ancestor(root)
logging.info("-- Get all children for a parent --")
[logging.info(" -- %s" % c.name) for c in self.get_all_children_for_a_parent() ]
logging.info("-- Get some children for a parent --")
[logging.info(" -- %s" % c.name) for c in self.get_all_children_for_a_parent() if c.name == "Child num 0 with parent Parent num 0" or c.name == "Doesn't exist" ]
logging.info("-- Get parent for child --")
child = Child_model.all()[0]
logging.info("Child: %s" % child.name)
logging.info("Parent: %s" % child.parent().name)
def get_all_children_for_a_parent(self):
parent = Parent_model.all()[0]
logging.info(" - %s" % parent.name)
return Child_model().all().ancestor(parent)
def populate(self):
root = Root_model(key_name="root")
root.put()
parents = []
for i in range(3):
parents.append(Parent_model(parent=root, name="Parent num %d" % i))
db.put(parents)
import random
children = []
for p in parents:
for i in range(random.randint(0,10)):
children.append(Child_model(parent=p, name="Child num %d with parent %s" % (i, p.name)))
db.put(children)
app = webapp2.WSGIApplication([('/(.*)', MainHandler)],
debug=True)
def main():
run_wsgi_app(app)
if __name__ == '__main__':
main()