存储和查询客户订单

PostgreSQLBeginner
立即练习

介绍

订单应用已有数据库连接,但还没有订单表。你将定义一个小型数据结构,存储三笔客户订单,并查询应用读取的数据。

请先完成上一项数据库连接实验。本实验独立启动,提供 PostgreSQL 实例、应用和已配置的 AWS CLI。测试结果后,你将删除练习数据库。

认证考试关联

本实验为以下考试主题提供入门实践。

定义订单表

本步骤创建数据结构,为每笔订单指定唯一标识、客户姓名和总额。

表通过预定义列存储数据行。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 查询使用了你指定的筛选条件。

数据库主用户适合创建这份表结构。下一项实验将为应用分配权限更少的数据库身份,让日常访问不必使用管理权限。 应用读取 PostgreSQL 主数据库中存储的三笔订单。

删除练习数据库

本步骤删除本实验的数据库及其中的订单数据。

提供的实例属于本练习,无须保留示例订单或最终快照:

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 读取相同的数据行。随后,你删除了练习数据库,并保留提供的应用和网络。

下一项实验将同时限制网络访问和应用的数据库权限。