1

我目前正在将 AWS Lambda (NodeJS) 与 AWS QLDB 一起使用。

场景是这样的。部署服务时,我有第一个表及其索引。因此将创建表和索引。我的问题是,一旦我需要添加新表及其索引;它无法创建索引,因为存在现有表。

即使我的 Ledger 中有一个现有表,我也能够创建新表的解决方法是我正在查询我拥有的表列表。

const getTables = async (transactionExecutor: TransactionExecutor) => {
  const statement = `SELECT name FROM information_schema.user_tables`;
  return await transactionExecutor.execute(statement);
};

然后我有这个条件来检查表是否已经存在

const tables = JSON.stringify(result.getResultList());

            if (
              !JSON.parse(tables).some((object): boolean => object.name === process.env.TABLE_NAME)
            ) {
              console.log('TABLE A NOT EXISTING');
              await createTable(transactionExecutor, process.env.TABLE_NAME);
            }
            if (
              !JSON.parse(tables).some(
                (object): boolean => object.name === process.env.TABLE_NAME_1,
              )
            ) {
              console.log('TABLE B NOT EXISTING');
              await createTable(transactionExecutor, process.env.TABLE_NAME_1);
            }

我不知道如何使用索引,我尝试在 QLDB 中使用 SQL 命令,但它不起作用。我希望你能帮助我。

谢谢

4

1 回答 1

4

我不太确定你的问题是什么(帖子标题和正文暗示不同的事情),但我会尽力回答。

首先,QLDB 将数据存储在 Ion 中,而不是 JSON。所以,请使用 Ion API 来解析数据,而不是 JSON 的。您的代码完全有效的原因是因为 Ion 是 JSON 的超集,并且结果集不包含 JSON 未知的类型。因此,例如,如果将结果集更改为包含 Ion Timestamp,那么您的代码就会中断。

接下来,实际获取表列表在驱动程序中具有一流的支持。只需使用driver.getTableNames.

第三,我认为您有一个问题“我可以向非空表添加索引吗?”。答案是不”。这是计划中的功能,我将在可用时更新此答案。更新:现在你可以了!https://aws.amazon.com/about-aws/whats-new/2020/09/amazon-qldb-launches-index-improvements/

最后,我认为您还在询问是否有一种方法可以在表上列出索引,就像在分类帐中列出表一样。答案是“是”。返回的文档information_schema.user_tables如下所示:

{
  tableId:"...",
  name:"THE_TABLE_NAME",
  indexes:[
    {
      expr:"[THE_FIELD_BEING_INDEXED]"
    }
  ],
  status:"ACTIVE"
}
于 2020-07-24T20:29:44.220 回答