You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:37:42