Step 4: Query the tables in a ledger
Important
End of support notice: Existing customers will be able to use Amazon QLDB until end of support on 07/31/2025. For more details, see
Migrate an Amazon QLDB Ledger to Amazon Aurora PostgreSQL
After creating tables in an Amazon QLDB ledger and loading them with data, you can run queries to review the vehicle registration data that you just inserted. QLDB uses PartiQL as its query language and Amazon Ion as its document-oriented data model.
PartiQL is an open-source, SQL-compatible query language that has been extended to work with Ion. With PartiQL, you can insert, query, and manage your data with familiar SQL operators. Amazon Ion is a superset of JSON. Ion is an open-source, document-based data format that gives you the flexibility of storing and processing structured, semistructured, and nested data.
In this step, you use SELECT
statements to read data from the tables in the
vehicle-registration
ledger.
Warning
When you run a query in QLDB without an indexed lookup, it invokes a full table scan. PartiQL supports such queries because it's SQL compatible. However, don't run table scans for production use cases in QLDB. Table scans can cause performance problems on large tables, including concurrency conflicts and transaction timeouts.
To avoid table scans, you must run statements with a WHERE
predicate clause
using an equality operator on an indexed field or a document ID; for
example, WHERE indexedField = 123
or WHERE indexedField IN (456, 789)
.
For more information, see Optimizing query performance.
To query the tables
-
Use the following program (
FindVehicles.ts
) to query all vehicles registered under a person in your ledger./* * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * software and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { QldbDriver, Result, TransactionExecutor } from "amazon-qldb-driver-nodejs"; import { dom } from "ion-js"; import { getQldbDriver } from "./ConnectToLedger"; import { PERSON } from "./model/SampleData"; import { PERSON_TABLE_NAME } from "./qldb/Constants"; import { error, log } from "./qldb/LogUtil"; import { getDocumentId } from "./qldb/Util"; import { prettyPrintResultList } from "./ScanTable"; /** * Query 'Vehicle' and 'VehicleRegistration' tables using a unique document ID in one transaction. * @param txn The {@linkcode TransactionExecutor} for lambda execute. * @param govId The owner's government ID. * @returns Promise which fulfills with void. */ async function findVehiclesForOwner(txn: TransactionExecutor, govId: string): Promise<void> { const documentId: string = await getDocumentId(txn, PERSON_TABLE_NAME, "GovId", govId); const query: string = "SELECT Vehicle FROM Vehicle INNER JOIN VehicleRegistration AS r " + "ON Vehicle.VIN = r.VIN WHERE r.Owners.PrimaryOwner.PersonId = ?"; await txn.execute(query, documentId).then((result: Result) => { const resultList: dom.Value[] = result.getResultList(); log(`List of vehicles for owner with GovId: ${govId}`); prettyPrintResultList(resultList); }); } /** * Find all vehicles registered under a person. * @returns Promise which fulfills with void. */ const main = async function(): Promise<void> { try { const qldbDriver: QldbDriver = getQldbDriver(); await qldbDriver.executeLambda(async (txn: TransactionExecutor) => { await findVehiclesForOwner(txn, PERSON[0].GovId); }); } catch (e) { error(`Error getting vehicles for owner: ${e}`); } } if (require.main === module) { main(); }
Note
First, this program queries the
Person
table for the document withGovId LEWISR261LL
to get itsid
metadata field.Then, it uses this document
id
as a foreign key to query theVehicleRegistration
table byPrimaryOwner.PersonId
. It also joinsVehicleRegistration
with theVehicle
table on theVIN
field. -
To run the transpiled program, enter the following command.
node dist/FindVehicles.js
To learn about modifying documents in the tables in the vehicle-registration
ledger, see Step 5: Modify documents in a ledger.