介绍
订单应用已有数据库连接,但还没有订单表。你将定义一个小型数据结构,存储三笔客户订单,并查询应用读取的数据。
请先完成上一项数据库连接实验。本实验独立启动,提供 PostgreSQL 实例、应用和已配置的 AWS CLI。测试结果后,你将删除练习数据库。
认证考试关联
本实验为以下考试主题提供入门实践。
- Cloud Practitioner (CLF-C02) · 任务 3.4:理解关系型数据库存储结构化应用数据的使用场景。
- Solutions Architect – Associate (SAA-C03) · 任务 3.3:理解关系型引擎和应用数据访问模式。
定义订单表
本步骤创建数据结构,为每笔订单指定唯一标识、客户姓名和总额。
表通过预定义列存储数据行。SQL 是定义和查询这些行的语言。RDS API 管理数据库实例,而 SQL 操作 PostgreSQL 引擎内部的数据。
加载准备好的 SQL 连接设置,并检查提供的实例:
cd /home/labex/project
source database.env
aws rds \
describe-db-instances \
--db-instance-identifier orders-db \
--query 'DBInstances[0].{Database:DBName,Endpoint:Endpoint,Status:DBInstanceStatus}'
实例处于可用状态,包含数据库 orders。其 psql 连接已配置为 service=orders-db。
使用 heredoc 创建表。两行 SQL 之间的文本作为 SQL 语句传递给 psql:
psql \
"service=orders-db" \
--set=ON_ERROR_STOP=1 <<'SQL'
CREATE TABLE orders (
order_id integer PRIMARY KEY,
customer text NOT NULL,
total numeric(8,2) NOT NULL CHECK (total > 0)
);
SQL
主键防止两行使用相同的订单 ID。NOT NULL 要求提供值。numeric(8,2) 存储保留两位小数的十进制数,CHECK 拒绝非正数总额。这些约束让数据库直接拒绝无效数据。
检查表:
psql \
"service=orders-db" \
--command '\d orders'
应看到三个列、一个主键和正数总额检查。表中还没有数据行。
存储三笔客户订单
本步骤插入少量数据,并立即读回检查。
INSERT 写入数据行。明确列名可以清楚表达每个值与对应列的关系:
psql \
"service=orders-db" \
--set=ON_ERROR_STOP=1 <<'SQL'
INSERT INTO orders (order_id, customer, total)
VALUES
(101, 'Maya', 49.90),
(102, 'Owen', 18.50),
(103, 'Nina', 25.25);
SELECT order_id, customer, total
FROM orders
ORDER BY order_id;
SQL
应看到包含上述值的三行。SELECT 读取已存储数据,ORDER BY 让显示顺序可预测。没有排序子句时,数据库不保证特定的行顺序。
AWS View 现在应显示同样的三笔订单。应用收到请求时会读取 PostgreSQL,因此创建表并插入数据后,原本不可用的订单列表便能显示实际应用数据。
查询订单并检查应用
本步骤回答一个业务问题,并对比 SQL 数据和应用响应。
团队需要金额至少为 25.00 的订单。WHERE 在生成结果前筛选数据行:
psql \
"service=orders-db" \
--command 'SELECT order_id, customer, total FROM orders WHERE total >= 25.00 ORDER BY order_id;'
应看到订单 101 和 103。筛选不会删除订单 102,只会选择返回哪些行。
聚合汇总多行中的值。统计全部订单数量,并计算总金额:
psql \
"service=orders-db" \
--command 'SELECT count(*) AS order_count, sum(total) AS order_total FROM orders;'
应看到 3 笔订单和总金额 93.65。
请求应用的订单列表:
curl \
--silent \
--show-error \
--fail \
http://127.0.0.1:8080/application/orders | jq
应看到全部三笔订单、数据库 orders、用户 orders_admin 和 read_only: false。SQL 与应用读取的是同一份已存储数据。应用返回完整列表,而之前的 SQL 查询使用了你指定的筛选条件。
数据库主用户适合创建这份表结构。下一项实验将为应用分配权限更少的数据库身份,让日常访问不必使用管理权限。

删除练习数据库
本步骤删除本实验的数据库及其中的订单数据。
提供的实例属于本练习,无须保留示例订单或最终快照:
aws rds \
delete-db-instance \
--db-instance-identifier orders-db \
--skip-final-snapshot \
--query 'DBInstance.DBInstanceIdentifier'
aws rds \
wait db-instance-deleted \
--db-instance-identifier orders-db
aws rds \
describe-db-instances \
--query 'DBInstances[].DBInstanceIdentifier'
应看到 []。删除实例会移除包含该表的数据库;这比 DELETE 的范围更大,后者仅删除现有表中的选定行。请保留准备好的应用和网络资源。
总结
你定义了包含约束的订单表结构,插入三条记录,并使用 SQL 筛选和聚合回答数据问题。应用从 PostgreSQL 读取相同的数据行。随后,你删除了练习数据库,并保留提供的应用和网络。
下一项实验将同时限制网络访问和应用的数据库权限。


