向Google Firestore添加文档时遭遇409错误:文档已存在
问题:Firestore添加文档重复ID/覆盖异常
我正在用Python、Flask和Firebase开发一款类待办Web应用,用户可在看板内创建列表整理工作。当前遇到Firestore文档创建的异常问题,具体情况如下:
原代码(使用add())
本意是获取用户输入的title,在boards子集合下添加带自动生成唯一ID的新文档,选择add()是因为它应该自动生成唯一ID,但每次调用都返回错误:
@boards.route("/board/create", methods=["POST"]) @login_required def create_board(): # Ensure title exists. if not request.form.get("title"): log.error("Title is empty.") return redirect("/profile") title = request.form.get("title") try: ref = firebase_database.collection("users").document(session["localId"]).collection("boards") # Add board to database. ref.add({ "timestamp": firestore.SERVER_TIMESTAMP, "title": title, "description": "" }) except Exception as e: log.error(f"Error connecting to database. {e}") return redirect("/profile") return redirect("/profile")
错误信息
ERROR: Error connecting to database. 409 Document already exists: .../users/sycvmE14lIVjDr6nHzwhy18wxNm2/boards/CqnIB5oN7SQjou5tXASs
按预期add()生成重复ID的概率极低,但反复测试均出现该错误。
尝试方案1:改用document()+set()
替换为以下代码后,无错误返回,但会反复覆盖同一ID的文档,仅偶尔生成不同ID:
try: ref = firebase_database.collection("users").document(session["localId"]).collection("boards").document() # Add board to database. ref.set({ "timestamp": firestore.SERVER_TIMESTAMP, "title": title, "description": "" })
尝试方案2:自定义唯一ID生成函数
编写了自定义ID生成函数,仍出现相同的覆盖问题,仿佛生成唯一ID的函数仅在运行时执行一次:
自定义ID生成函数
def generate_random_id(size : int = 20): chars = string.ascii_letters + string.digits return "".join(random.choice(chars) for _ in range(size))
使用自定义ID的代码
try: ref = firebase_database.collection("users").document(session["localId"]).collection("boards").document(generate_random_id()) # Add board to database. ref.set({ "timestamp": firestore.SERVER_TIMESTAMP, "title": title, "description": "" })
调用接口的HTML表单
<form action="/board/create" method="post"> <input name="title" type="text" placeholder="Title"> <button>Add</button> </form>
恳请帮助排查此问题。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

