【问题标题】:Can I run multiple faunadb transactions in the one request?我可以在一个请求中运行多个动物数据库事务吗?
【发布时间】:2021-11-30 23:36:44
【问题描述】:

可以让 Fauna 使用 Do 顺序执行表达式。但是,在这种特殊情况下它不起作用:

Do(
  CreateCollection({ name: "users" }),
  CreateIndex({
    name: "users_by_email",
    permissions: { read: "public" },
    source: Collection("users"),
    terms: [{field: ["data", "email"]}],
    unique: true
  }) 
)

我认为这是因为“索引 [...] 可能不会在与其源集合相同的事务中创建。” https://docs.fauna.com/fauna/current/api/fql/functions/createindex?lang=javascript

如何在一个请求中有效地同时提交我的集合和索引创建命令?

【问题讨论】:

    标签: faunadb


    【解决方案1】:

    直接回答标题问题:不。一个“请求”就是一个交易。

    但是,正如您所指出的,可以在单个事务中执行多个 FQL 表达式,例如您使用 Do 函数。

    Do 函数不适用于您的示例的原因是 Fauna 查询执行器在评估事务表达式时执行读取和聚合写入意图,但 all 写效果发生在事务结束时。这意味着在评估您的 CreateIndex 表达式时,该集合尚未完全写入,因此在需要时不存在 Collection("users")

    这就是文档中存在警告的原因。您需要在一个事务中创建集合,并在另一个事务中创建索引。如果您要部署已知模式,则可以在单个事务中创建所有集合,并在一秒钟内创建所有索引。这是最佳实践答案。

    不过,目前 API v4 可以通过使用 Let 函数来完成这项工作:

    Let(
      {
         collection: CreateCollection({ name: "users" }),
         collection_ref: Select("ref", Var("collection")),
      },
      CreateIndex({
        name: "users_by_email",
        source: Var("collection_ref"),
        terms: [{field: ["data", "email"]}],
        unique: true,
      })
    )
    

    这样做的原因是索引的source 字段需要有效的引用。通过在命名变量中捕获CreateCollection 的结果,可以通过变量在CreateIndex 表达式中使用引用。

    将来,查询执行器可能会升级,以验证source 字段中变量提供的所有引用的合法性。如果/当这种情况发生时,这种技术将不再有效。 使用此技术需要您自担风险

    【讨论】:

    • 一个非常详细的答案,谢谢!所有集合,然后是所有索引确实是我现在正在做的事情,它运行得很好,只是好奇我是否可以进一步加快我的测试数据库创建速度:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多