云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"}}}

链接

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何通过标记名检索多个标记中的元素以进行selenium自动化测试   java iText如何查找最后一行被拆分到下一页   java如何在hudson中的特定jdk上运行Findbugs和PMD?   如何确保java程序与java Environment 6兼容?   对形状进行分组,这样我就可以通过鼠标点击和java处理循环浏览它们   使用生成器映射对象时,java定义无效   maven Java:Struts2和IntelliJ供初学者使用   java子类不继承父类字段   java Android Grid View在Android版本kitkat上崩溃   java Hibernate从缓存返回错误的列表,即使预期的列表与缓存的列表不同   java SendGrid:模板和替换标记   用于普通生产者| Kafka流的java自定义分区器   安卓理解Java内部类中的作用域   无法从Android Studio中的非静态方法调用java非静态方法   比较两个XML响应的JavaXMLUnit   java使用keytool列出密钥   不使用Java客户端库将视频上传到YouTube数据API v3   java My While循环即使在满足条件时也不会结束   自动在外部存储字符串数据,以便以后在Java中使用