在GAE上动态创建数据库模型
2009 11 16 12:40 PM 1635次查看
分类:Google App Engine 标签:Google App Engine, Python
例如用户需要临时创建一个Book类,这个类有title、author和rating这3个参数,但程序事先是不知道的。
暂且不考虑他这样做的用意,只说这在技术上是可行的。
最容易想到的方法当然是eval,但显得不太安全,也很笨拙。
其实之前我在《Python的metaclass》里有介绍过type()和new.classobj(),它们干这种事很方便:
from google.appengine.ext import db
property = {'string': db.StringProperty, 'rating': db.RatingProperty}
Book = type('Book', (db.Model,), {'title': property['string'](), 'author': property['string'](), 'rating': property['rating']()})
new_book = Book(**{'title': 'Harry James Potter', 'author': 'Joanne Kathleen Rowling', 'rating': 100})
new_book.put()
book = Book.all().filter('title =', 'Harry James Potter').get()
print book.title
print book.author
print book.rating
其中,property是需要事先构造的,不过属性类型就那么20种左右。其他参数则都是可以从字符串构造得到的。最终得到了这个结果:
Harry James Potter至于Java是否能做到我就不清楚了,因为动态构造类型是动态语言的长项,静态语言想要模拟的确很难。
Joanne Kathleen Rowling
100
0条评论 你不来一发么↓