带有祖先查询的Google App Engine数据存储/ NoSQL示例 [英] Google App Engine Datastore / NoSQL example with ancestor queries
本文介绍了带有祖先查询的Google App Engine数据存储/ NoSQL示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我非常习惯SQL,而不是App Engine Datastore的NoSQL范例,因此我必须编写一段示例代码来了解如何正确执行祖先查询。以为我会在这里与你分享;也许这对某人来说很有趣。
b $ b# - * - 编码:utf-8 - * -从google.appengine.ext.webapp.util导入webapp2
导入run_wsgi_app
导入日志记录
from google.appengine.ext导入数据库
#模型
class Child_model(db.Model):
name = db.StringProperty()
class Parent_model(db.Model):
name = db.StringProperty()
class Root_model(db.Model):
pass
$ MAIN $ b $ class MainHandler(webapp2.RequestHandler):
def get(self,url):
如果不是root_model.get_by_key_name(root):
#Populate db首次运行
self.populate()
logging.info( - 获取所有入口 - 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()。祖先(根)
logging.info( - 获取父母的所有孩子 - )
[logging.info( - %s%c.name)for c in self.get_all_children_for_a_parent()]
logging.info( - 获取父母的一些孩子 - )
[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 0or c.name ==does not exist]
logging。 info( - Get child 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)
返回Child_model()。all()。祖先(父母)
def populate(self):
root = Root_model(key_name =root)
root.put()
$ (3):
parents.append(Parent_model(parent = root,name =Parent num%d%i))
db .put(父母)
进口随机数
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()
I'm very used to SQL, and not the NoSQL paradigm of App Engine Datastore, so I had to write a piece of example code to understand how to do ancestor queries correctly. Thought I'd share it with you here; maybe it's interesting to someone.
解决方案
#!/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()
这篇关于带有祖先查询的Google App Engine数据存储/ NoSQL示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文