要开始对数据库进行查询,首先得创建数据库模式。我们将设计一个名为 products 的简单模式,模拟线上商店可能库存的真实商品。先定义几个实体,再转为数据库表。
品牌是生产多种不同产品的制造商。例如,福特(Ford)是一个品牌,生产福克斯、F150 等多款汽车。
产品属于一个品牌,品牌与产品之间是一对多关系。为简化,我们的产品只包含名称。比如“福克斯”是一款产品,品牌是“福特”。此外,每个产品有多种尺寸和颜色。我们将可用的尺寸和颜色定义为 SKU。
SKU 是“库存单位”的缩写,代表商店销售的具体商品。例如,“牛仔裤”是待售商品,一个 SKU 可能是“牛仔裤,中码,蓝色”或“牛仔裤,小码,黑色”。产品与 SKU 也是一对多关系。
产品可有多种尺寸。本例中我们只考虑三种:小、中、大。每个 SKU 对应一个产品尺寸,因此产品尺寸与 SKU 是一对多关系。
产品可有多种颜色。本例中库存只有两种颜色:黑色和蓝色。产品颜色与 SKU 也是一对多关系。
综合来看,我们建模的数据库结构如图 5.1 所示。
接下来,定义一些变量存储创建该模式所需的 SQL 语句。使用 asyncpg 执行这些语句来创建产品数据库。由于尺寸和颜色是固定的,我们还会预先插入几条记录到 product_size 和 product_color 表中。我们将在后续代码清单中引用这些变量,避免重复冗长的 SQL 创建语句。
CREATE_BRAND_TABLE = \ """ CREATE TABLE IF NOT EXISTS brand( brand_id SERIAL PRIMARY KEY, brand_name TEXT NOT NULL );"""CREATE_PRODUCT_TABLE = \ """ CREATE TABLE IF NOT EXISTS product( product_id SERIAL PRIMARY KEY, product_name TEXT NOT NULL, brand_id INT NOT NULL, FOREIGN KEY (brand_id) REFERENCES brand(brand_id) );"""CREATE_PRODUCT_COLOR_TABLE = \ """ CREATE TABLE IF NOT EXISTS product_color( product_color_id SERIAL PRIMARY KEY, product_color_name TEXT NOT NULL );"""CREATE_PRODUCT_SIZE_TABLE = \ """ CREATE TABLE IF NOT EXISTS product_size( product_size_id SERIAL PRIMARY KEY, product_size_name TEXT NOT NULL );"""CREATE_SKU_TABLE = \ """ CREATE TABLE IF NOT EXISTS sku( sku_id SERIAL PRIMARY KEY, product_id INT NOT NULL, product_size_id INT NOT NULL, product_color_id INT NOT NULL, FOREIGN KEY (product_id) REFERENCES product(product_id), FOREIGN KEY (product_size_id) REFERENCES product_size(product_size_id), FOREIGN KEY (product_color_id) REFERENCES product_color(product_color_id) );"""COLOR_INSERT = \ """ INSERT INTO product_color VALUES(1, 'Blue'); INSERT INTO product_color VALUES(2, 'Black'); """SIZE_INSERT = \ """ INSERT INTO product_size VALUES(1, 'Small'); INSERT INTO product_size VALUES(2, 'Medium'); INSERT INTO product_size VALUES(3, 'Large'); """
有了创建表和插入尺寸颜色的语句,接下来就需要一种方式来运行这些查询。