如何在不创建节点的情况下生成Firebase实时数据库有效密钥?
问题:无写入操作生成Firebase实时数据库密钥
我想要编写一个Python函数,生成Firebase实时数据库的有效密钥,要求和官方密钥逻辑一致,保证无冲突且按时间顺序排列。目前我用的代码如下:
def get_new_key() -> str: return db.reference(app=firebase_app).push().key print(get_new_key()) # output: '-OOvws9uQDq9Ozacldjr'
但根据官方文档说明,这种方式会创建一个值为空字符串的节点。请问是否有办法在不向数据库添加任何内容的情况下获取该密钥?
我目前想到的办法是自行实现官方的密钥生成算法,但这既冗余,又在算法变更时缺乏前瞻性。
解决方案
目前Firebase Admin Python SDK并没有提供直接生成密钥而不写入数据库的公开API,不过有两种实用方案:
生成后立即删除空节点
既然push()会创建空节点,你可以在获取密钥后马上删除这个节点,这样既拿到了符合官方逻辑的密钥,又不会在数据库里留下无效数据。代码示例:def get_new_key() -> str: ref = db.reference(app=firebase_app).push() key = ref.key ref.delete() return key这个方法完全复用官方逻辑,不用担心算法变更的问题,而且操作几乎不会对数据库产生影响——即使偶尔删除失败,空节点也不会干扰业务,后续可以通过简单的清理脚本处理。
调用SDK内部的密钥生成逻辑
如果你完全不想有任何数据库写入操作,可以直接调用SDK内部封装的密钥生成类。Firebase Admin SDK的Python版本中,密钥生成逻辑在firebase_admin.db模块的_PushId类里,直接实例化并调用generate()方法即可:from firebase_admin.db import _PushId def get_new_key() -> str: return _PushId().generate()注意:这是调用SDK的内部未公开API,虽然当前版本稳定,但官方可能在未来更新中修改内部实现,所以需要关注SDK的更新日志。不过相比自己重新实现算法,这种方式更贴近官方逻辑,维护成本低很多。
内容的提问来源于stack exchange,提问作者XGeffrier
相关产品推荐
相关产品推荐

