云firestore orm灵感来自ndb
fsglue的Python项目详细描述
F胶水
googlecloudfirestore的简单ORM灵感来自datastore client library ndb,由{a2}使用(仅限日语)。在
安装
pip install fsglue
简单用法
^{pr2}$客户端初始化
情况1
从环境初始化。 不需要代码。在
案例2
由firestore.Client
初始化。
下面的代码将把kwargs传递给firestore.Client(**kwargs)
。在
fsglue.initialize(**kwargs)
案例3
由firebase_admin初始化。在
importfirebase_adminfromfirebase_adminimportcredentialsfromfirebase_adminimportfirestorecred=credentials.Certificate('path/to/serviceAccount.json')firebase_admin.initialize_app(cred)
模型样品
classUser(fsglue.BaseModel):COLLECTION_PATH="users"COLLECTION_PATH_PARAMS=[]name=fsglue.StringProperty(required=True)created_at=fsglue.TimestampProperty(auto_now=True)updated_at=fsglue.TimestampProperty(auto_now_add=True)@classmethoddefcreate_by_name(cls,name):returncls.create_by_dict({"name":name})# JsonSchema Definition for JsonPropertyTAGS_SCHEMA={"type":"array","items":{"type":"string",},}classRoom(fsglue.BaseModel):COLLECTION_PATH="rooms"COLLECTION_PATH_PARAMS=[]name=fsglue.StringProperty(required=True)owner=fsglue.StringProperty(required=True)tags=fsglue.JsonProperty(schema=TAGS_SCHEMA,default=[])created_at=fsglue.TimestampProperty(auto_now=True)updated_at=fsglue.TimestampProperty(auto_now_add=True)@classmethoddefcreate_by_user(cls,user,tags=[]):room=cls.create()room.name="untitled"room.owner=user.doc_idroom.tags=tagsroom.put()returnroomdefpost_message(self,user,body):msg=Message.create(self.doc_id)msg.body=bodymsg.created_by=user.doc_idmsg.put()returnmsgdeffetch_latest_messages(self):returnMessage.all(self.doc_id,limit=100,order_by="-created_at")classMessage(fsglue.BaseModel):COLLECTION_PATH="rooms/{0}/messages"COLLECTION_PATH_PARAMS=["room_id"]body=fsglue.StringProperty(required=True)created_by=fsglue.StringProperty(required=True)created_at=fsglue.TimestampProperty(auto_now=True)
操作样本
创建
使用.create()
和{
john=User.create()john.name="john"john.put()room1=Room.create()room1.name="test"room1.owner=john.doc_idroom1.tags=["test"]room1.put()message11=Message.create(room1.doc_id)# parent_id = room1.doc_idmessage11.body="hello fsglue!"message11.put()
使用.create_by_dict()
john=User.create_by_dict({"name":"john"})room1=Roomt.create_by_dict({"name":"test","owner":john.doc_id,"tags":["test"]})message11=Message.create_by_dict({"body":"hello fsglue!"},room1.doc_id)# parent_id = room1.doc_d
使用自定义方法
john=User.create_by_name("john")room1=Room.create_by_user(john,tags=["test"])message11=Room.post_message(john,"hello fsglue!")
获取
使用.get_by_id()
john=User.get_by_id("xxx")# return None if not existsroom1=Room.get_by_id("yyy")message11=Message.get_by_id("zzz",room1.doc_id)
{cd7>使用
john=User.get_by_ids(["xxx"])[0]room1=Room.get_by_ids(["yyy"])[0]message11=Message.get_by_ids(["zzz"],room1.doc_id)[0]
使用.all()
users=User.all(limit=10)rooms=Room.all(limit=10)messages1=Message.all(room1.doc_id,limit=10)# get messages belong to room1
使用.where()
john=User.where([["name","==","john"]])[0]room1=Room.where([["name","==","room1"]])[0]messages11=Message.where([["body","==","hello fsglue!"]])[0]
使用.stream()
foruserinUser.stream():# iterate all usersprint(user)
更新
使用.get_by_id()
和{
john=User.get_by_id("xxx")john.name="john!"john.put()
使用.update_by_dict()
john=User.update_by_dict({"id":"xxx","name":"john!"})# values require DocumentId in "id" fieldroom1=Room.update_by_dict({"id":"yyy","name":"test1"})message11=Message.update_by_dict({"id":"zzz","body":"hello fsglue!?"},room1.doc_id)
删除
使用.get_by_id()
和{
john=User.get_by_id("xxx")john.delete()
使用.get_by_id()
和{
room1=Room.get_by_id("yyy")room1.delete_all()# delete_all() will delete room1 and messages belong to room1
生成JsonSchema
Room.to_schema()
将生成以下JsonSchema定义
{"type":"object","required":["name","owner"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"owner":{"type":"string"},"created_at":{"type":"number"},"updated_at":{"type":"number"}}}
链接
- 项目
标签: